]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/FdfParser.py
BaseTools: Extend the keyword "!include"/"!if" to case-insensitive
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
CommitLineData
30fdf114
LG
1## @file\r
2# parse FDF file\r
3#\r
a87e79d9 4# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
118bf096 5# Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
30fdf114 6#\r
40d841f6 7# This program and the accompanying materials\r
30fdf114
LG
8# are licensed and made available under the terms and conditions of the BSD License\r
9# which accompanies this distribution. The full text of the license may be found at\r
10# http://opensource.org/licenses/bsd-license.php\r
11#\r
12# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14#\r
15\r
16##\r
17# Import Modules\r
18#\r
72443dd2 19from __future__ import print_function\r
bfa65b61 20from __future__ import absolute_import\r
0d2711a6
LG
21import re\r
22\r
bfa65b61
GL
23from . import Fd\r
24from . import Region\r
25from . import Fv\r
26from . import AprioriSection\r
27from . import FfsInfStatement\r
28from . import FfsFileStatement\r
29from . import VerSection\r
30from . import UiSection\r
31from . import FvImageSection\r
32from . import DataSection\r
33from . import DepexSection\r
34from . import CompressSection\r
35from . import GuidSection\r
36from . import Capsule\r
37from . import CapsuleData\r
38from . import Rule\r
39from . import RuleComplexFile\r
40from . import RuleSimpleFile\r
41from . import EfiSection\r
42from . import Vtf\r
43from . import ComponentStatement\r
44from . import OptionRom\r
45from . import OptRomInfStatement\r
46from . import OptRomFileStatement\r
cfbe3c35 47import string\r
30fdf114 48\r
bfa65b61 49from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
30fdf114
LG
50from Common.BuildToolError import *\r
51from Common import EdkLogger\r
14c48571 52from Common.Misc import PathClass\r
5a57246e 53from Common.StringUtils import NormPath\r
0d2711a6
LG
54import Common.GlobalData as GlobalData\r
55from Common.Expression import *\r
df692f02 56from Common import GlobalData\r
55c84777 57from Common.DataType import *\r
5a57246e 58from Common.StringUtils import ReplaceMacro\r
91ae2988 59import uuid\r
d0acc87a 60from Common.Misc import tdict\r
94e4bcbb 61from Common.MultipleWorkspace import MultipleWorkspace as mws\r
1be2ed90
HC
62import Common.LongFilePathOs as os\r
63from Common.LongFilePathSupport import OpenLongFilePath as open\r
bfa65b61
GL
64from .Capsule import EFI_CERT_TYPE_PKCS7_GUID\r
65from .Capsule import EFI_CERT_TYPE_RSA2048_SHA256_GUID\r
2eb370ff 66from Common.RangeExpression import RangeExpression\r
30fdf114
LG
67\r
68##define T_CHAR_SPACE ' '\r
69##define T_CHAR_NULL '\0'\r
70##define T_CHAR_CR '\r'\r
71##define T_CHAR_TAB '\t'\r
72##define T_CHAR_LF '\n'\r
73##define T_CHAR_SLASH '/'\r
74##define T_CHAR_BACKSLASH '\\'\r
75##define T_CHAR_DOUBLE_QUOTE '\"'\r
76##define T_CHAR_SINGLE_QUOTE '\''\r
77##define T_CHAR_STAR '*'\r
78##define T_CHAR_HASH '#'\r
79\r
80(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \\r
81T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \\r
82(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')\r
83\r
84SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')\r
85\r
0d2711a6 86RegionSizePattern = re.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")\r
543f5ac3
B
87RegionSizeGuidPattern = re.compile("\s*(?P<base>\w+\.\w+[\.\w\[\]]*)\s*\|\s*(?P<size>\w+\.\w+[\.\w\[\]]*)\s*")\r
88RegionOffsetPcdPattern = re.compile("\s*(?P<base>\w+\.\w+[\.\w\[\]]*)\s*$")\r
64b2609f 89ShortcutPcdPattern = re.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")\r
ffe720c5 90BaseAddrValuePattern = re.compile('^0[xX][0-9a-fA-F]+')\r
95cc4962
FY
91FileExtensionPattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
92TokenFindPattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
118bf096
CS
93AllIncludeFileList = []\r
94\r
95# Get the closest parent\r
96def GetParentAtLine (Line):\r
97 for Profile in AllIncludeFileList:\r
98 if Profile.IsLineInFile(Line):\r
99 return Profile\r
100 return None\r
101\r
102# Check include loop\r
103def IsValidInclude (File, Line):\r
104 for Profile in AllIncludeFileList:\r
105 if Profile.IsLineInFile(Line) and Profile.FileName == File:\r
106 return False\r
107\r
108 return True\r
30fdf114
LG
109\r
110def GetRealFileLine (File, Line):\r
111\r
112 InsertedLines = 0\r
118bf096
CS
113 for Profile in AllIncludeFileList:\r
114 if Profile.IsLineInFile(Line):\r
115 return Profile.GetLineInFile(Line)\r
116 elif Line >= Profile.InsertStartLineNumber and Profile.Level == 1:\r
df81077f 117 InsertedLines += Profile.GetTotalLines()\r
30fdf114
LG
118\r
119 return (File, Line - InsertedLines)\r
120\r
121## The exception class that used to report error messages when parsing FDF\r
122#\r
123# Currently the "ToolName" is set to be "FDF Parser".\r
124#\r
125class Warning (Exception):\r
126 ## The constructor\r
127 #\r
128 # @param self The object pointer\r
129 # @param Str The message to record\r
130 # @param File The FDF name\r
131 # @param Line The Line number that error occurs\r
132 #\r
133 def __init__(self, Str, File = None, Line = None):\r
134\r
135 FileLineTuple = GetRealFileLine(File, Line)\r
136 self.FileName = FileLineTuple[0]\r
137 self.LineNumber = FileLineTuple[1]\r
118bf096 138 self.OriginalLineNumber = Line\r
30fdf114
LG
139 self.Message = Str\r
140 self.ToolName = 'FdfParser'\r
141\r
142 def __str__(self):\r
143 return self.Message\r
144\r
30fdf114
LG
145## The Include file content class that used to record file data when parsing include file\r
146#\r
147# May raise Exception when opening file.\r
148#\r
149class IncludeFileProfile :\r
150 ## The constructor\r
151 #\r
152 # @param self The object pointer\r
153 # @param FileName The file that to be parsed\r
154 #\r
155 def __init__(self, FileName):\r
156 self.FileName = FileName\r
157 self.FileLinesList = []\r
158 try:\r
159 fsock = open(FileName, "rb", 0)\r
160 try:\r
161 self.FileLinesList = fsock.readlines()\r
47a29bc7
YF
162 for index, line in enumerate(self.FileLinesList):\r
163 if not line.endswith('\n'):\r
164 self.FileLinesList[index] += '\n'\r
165\r
30fdf114
LG
166 finally:\r
167 fsock.close()\r
168\r
169 except:\r
170 EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=FileName)\r
171\r
172 self.InsertStartLineNumber = None\r
173 self.InsertAdjust = 0\r
118bf096
CS
174 self.IncludeFileList = []\r
175 self.Level = 1 # first level include file\r
f7496d71 176\r
118bf096
CS
177 def GetTotalLines(self):\r
178 TotalLines = self.InsertAdjust + len(self.FileLinesList)\r
179\r
180 for Profile in self.IncludeFileList:\r
df81077f 181 TotalLines += Profile.GetTotalLines()\r
118bf096
CS
182\r
183 return TotalLines\r
184\r
185 def IsLineInFile(self, Line):\r
186 if Line >= self.InsertStartLineNumber and Line < self.InsertStartLineNumber + self.GetTotalLines():\r
187 return True\r
188\r
189 return False\r
190\r
191 def GetLineInFile(self, Line):\r
192 if not self.IsLineInFile (Line):\r
193 return (self.FileName, -1)\r
f7496d71 194\r
118bf096
CS
195 InsertedLines = self.InsertStartLineNumber\r
196\r
197 for Profile in self.IncludeFileList:\r
198 if Profile.IsLineInFile(Line):\r
199 return Profile.GetLineInFile(Line)\r
200 elif Line >= Profile.InsertStartLineNumber:\r
201 InsertedLines += Profile.GetTotalLines()\r
202\r
203 return (self.FileName, Line - InsertedLines + 1)\r
204\r
205\r
30fdf114
LG
206\r
207## The FDF content class that used to record file data when parsing FDF\r
208#\r
209# May raise Exception when opening file.\r
210#\r
211class FileProfile :\r
212 ## The constructor\r
213 #\r
214 # @param self The object pointer\r
215 # @param FileName The file that to be parsed\r
216 #\r
217 def __init__(self, FileName):\r
218 self.FileLinesList = []\r
219 try:\r
220 fsock = open(FileName, "rb", 0)\r
221 try:\r
222 self.FileLinesList = fsock.readlines()\r
223 finally:\r
224 fsock.close()\r
225\r
226 except:\r
227 EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=FileName)\r
228\r
543f5ac3 229 self.FileName = FileName\r
30fdf114 230 self.PcdDict = {}\r
543f5ac3 231 self.PcdLocalDict = {}\r
30fdf114 232 self.InfList = []\r
2502b735 233 self.InfDict = {'ArchTBD':[]}\r
d0acc87a
LG
234 # ECC will use this Dict and List information\r
235 self.PcdFileLineDict = {}\r
236 self.InfFileLineList = []\r
f7496d71 237\r
30fdf114 238 self.FdDict = {}\r
52302d4d 239 self.FdNameNotSet = False\r
30fdf114 240 self.FvDict = {}\r
fd171542 241 self.CapsuleDict = {}\r
30fdf114
LG
242 self.VtfList = []\r
243 self.RuleDict = {}\r
244 self.OptRomDict = {}\r
a3251d84 245 self.FmpPayloadDict = {}\r
30fdf114
LG
246\r
247## The syntax parser for FDF\r
248#\r
249# PreprocessFile method should be called prior to ParseFile\r
250# CycleReferenceCheck method can detect cycles in FDF contents\r
251#\r
252# GetNext*** procedures mean these procedures will get next token first, then make judgement.\r
253# Get*** procedures mean these procedures will make judgement on current token only.\r
254#\r
255class FdfParser:\r
256 ## The constructor\r
257 #\r
258 # @param self The object pointer\r
259 # @param FileName The file that to be parsed\r
260 #\r
261 def __init__(self, FileName):\r
262 self.Profile = FileProfile(FileName)\r
263 self.FileName = FileName\r
264 self.CurrentLineNumber = 1\r
265 self.CurrentOffsetWithinLine = 0\r
266 self.CurrentFdName = None\r
267 self.CurrentFvName = None\r
268 self.__Token = ""\r
269 self.__SkippedChars = ""\r
97fa0ee9 270 GlobalData.gFdfParser = self\r
30fdf114 271\r
d0acc87a
LG
272 # Used to section info\r
273 self.__CurSection = []\r
274 # Key: [section name, UI name, arch]\r
275 # Value: {MACRO_NAME : MACRO_VALUE}\r
276 self.__MacroDict = tdict(True, 3)\r
277 self.__PcdDict = {}\r
278\r
30fdf114 279 self.__WipeOffArea = []\r
14c48571 280 if GenFdsGlobalVariable.WorkSpaceDir == '':\r
281 GenFdsGlobalVariable.WorkSpaceDir = os.getenv("WORKSPACE")\r
30fdf114 282\r
30fdf114
LG
283 ## __SkipWhiteSpace() method\r
284 #\r
285 # Skip white spaces from current char, return number of chars skipped\r
286 #\r
287 # @param self The object pointer\r
288 # @retval Count The number of chars skipped\r
289 #\r
290 def __SkipWhiteSpace(self):\r
291 Count = 0\r
292 while not self.__EndOfFile():\r
293 Count += 1\r
294 if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):\r
295 self.__SkippedChars += str(self.__CurrentChar())\r
296 self.__GetOneChar()\r
297\r
298 else:\r
299 Count = Count - 1\r
300 return Count\r
301\r
302 ## __EndOfFile() method\r
303 #\r
304 # Judge current buffer pos is at file end\r
305 #\r
306 # @param self The object pointer\r
307 # @retval True Current File buffer position is at file end\r
308 # @retval False Current File buffer position is NOT at file end\r
309 #\r
310 def __EndOfFile(self):\r
311 NumberOfLines = len(self.Profile.FileLinesList)\r
312 SizeOfLastLine = len(self.Profile.FileLinesList[-1])\r
313 if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:\r
314 return True\r
315 elif self.CurrentLineNumber > NumberOfLines:\r
316 return True\r
317 else:\r
318 return False\r
319\r
320 ## __EndOfLine() method\r
321 #\r
322 # Judge current buffer pos is at line end\r
323 #\r
324 # @param self The object pointer\r
325 # @retval True Current File buffer position is at line end\r
326 # @retval False Current File buffer position is NOT at line end\r
327 #\r
328 def __EndOfLine(self):\r
329 if self.CurrentLineNumber > len(self.Profile.FileLinesList):\r
330 return True\r
331 SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
332 if self.CurrentOffsetWithinLine >= SizeOfCurrentLine:\r
333 return True\r
334 else:\r
335 return False\r
336\r
337 ## Rewind() method\r
338 #\r
339 # Reset file data buffer to the initial state\r
340 #\r
341 # @param self The object pointer\r
118bf096 342 # @param DestLine Optional new destination line number.\r
f7496d71 343 # @param DestOffset Optional new destination offset.\r
30fdf114 344 #\r
f7496d71
LG
345 def Rewind(self, DestLine = 1, DestOffset = 0):\r
346 self.CurrentLineNumber = DestLine\r
347 self.CurrentOffsetWithinLine = DestOffset\r
30fdf114
LG
348\r
349 ## __UndoOneChar() method\r
350 #\r
351 # Go back one char in the file buffer\r
352 #\r
353 # @param self The object pointer\r
354 # @retval True Successfully go back one char\r
355 # @retval False Not able to go back one char as file beginning reached\r
356 #\r
357 def __UndoOneChar(self):\r
358\r
359 if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:\r
360 return False\r
361 elif self.CurrentOffsetWithinLine == 0:\r
362 self.CurrentLineNumber -= 1\r
363 self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1\r
364 else:\r
365 self.CurrentOffsetWithinLine -= 1\r
366 return True\r
367\r
368 ## __GetOneChar() method\r
369 #\r
370 # Move forward one char in the file buffer\r
371 #\r
372 # @param self The object pointer\r
373 #\r
374 def __GetOneChar(self):\r
375 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
0d2711a6
LG
376 self.CurrentLineNumber += 1\r
377 self.CurrentOffsetWithinLine = 0\r
30fdf114 378 else:\r
0d2711a6 379 self.CurrentOffsetWithinLine += 1\r
30fdf114
LG
380\r
381 ## __CurrentChar() method\r
382 #\r
383 # Get the char pointed to by the file buffer pointer\r
384 #\r
385 # @param self The object pointer\r
386 # @retval Char Current char\r
387 #\r
388 def __CurrentChar(self):\r
389 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]\r
390\r
391 ## __NextChar() method\r
392 #\r
393 # Get the one char pass the char pointed to by the file buffer pointer\r
394 #\r
395 # @param self The object pointer\r
396 # @retval Char Next char\r
397 #\r
398 def __NextChar(self):\r
399 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
400 return self.Profile.FileLinesList[self.CurrentLineNumber][0]\r
401 else:\r
402 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]\r
403\r
404 ## __SetCurrentCharValue() method\r
405 #\r
406 # Modify the value of current char\r
407 #\r
408 # @param self The object pointer\r
409 # @param Value The new value of current char\r
410 #\r
411 def __SetCurrentCharValue(self, Value):\r
412 self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value\r
413\r
414 ## __CurrentLine() method\r
415 #\r
416 # Get the list that contains current line contents\r
417 #\r
418 # @param self The object pointer\r
419 # @retval List current line contents\r
420 #\r
421 def __CurrentLine(self):\r
422 return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
423\r
424 def __StringToList(self):\r
425 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesList]\r
3b46dd93
YF
426 if not self.Profile.FileLinesList:\r
427 EdkLogger.error('FdfParser', FILE_READ_FAILURE, 'The file is empty!', File=self.FileName)\r
30fdf114
LG
428 self.Profile.FileLinesList[-1].append(' ')\r
429\r
30fdf114
LG
430 def __ReplaceFragment(self, StartPos, EndPos, Value = ' '):\r
431 if StartPos[0] == EndPos[0]:\r
432 Offset = StartPos[1]\r
433 while Offset <= EndPos[1]:\r
434 self.Profile.FileLinesList[StartPos[0]][Offset] = Value\r
435 Offset += 1\r
436 return\r
437\r
438 Offset = StartPos[1]\r
439 while self.Profile.FileLinesList[StartPos[0]][Offset] not in ('\r', '\n'):\r
440 self.Profile.FileLinesList[StartPos[0]][Offset] = Value\r
441 Offset += 1\r
442\r
443 Line = StartPos[0]\r
444 while Line < EndPos[0]:\r
445 Offset = 0\r
446 while self.Profile.FileLinesList[Line][Offset] not in ('\r', '\n'):\r
447 self.Profile.FileLinesList[Line][Offset] = Value\r
448 Offset += 1\r
449 Line += 1\r
450\r
451 Offset = 0\r
452 while Offset <= EndPos[1]:\r
453 self.Profile.FileLinesList[EndPos[0]][Offset] = Value\r
454 Offset += 1\r
455\r
456\r
d5d56f1b
LG
457 def __GetMacroName(self):\r
458 if not self.__GetNextToken():\r
459 raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
460 MacroName = self.__Token\r
461 NotFlag = False\r
462 if MacroName.startswith('!'):\r
463 NotFlag = True\r
464 MacroName = MacroName[1:].strip()\r
f7496d71 465\r
d5d56f1b
LG
466 if not MacroName.startswith('$(') or not MacroName.endswith(')'):\r
467 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},\r
468 self.FileName, self.CurrentLineNumber)\r
469 MacroName = MacroName[2:-1]\r
470 return MacroName, NotFlag\r
d0acc87a
LG
471\r
472 def __SetMacroValue(self, Macro, Value):\r
473 if not self.__CurSection:\r
474 return\r
475\r
476 MacroDict = {}\r
477 if not self.__MacroDict[self.__CurSection[0], self.__CurSection[1], self.__CurSection[2]]:\r
478 self.__MacroDict[self.__CurSection[0], self.__CurSection[1], self.__CurSection[2]] = MacroDict\r
479 else:\r
480 MacroDict = self.__MacroDict[self.__CurSection[0], self.__CurSection[1], self.__CurSection[2]]\r
481 MacroDict[Macro] = Value\r
482\r
483 def __GetMacroValue(self, Macro):\r
484 # Highest priority\r
485 if Macro in GlobalData.gCommandLineDefines:\r
486 return GlobalData.gCommandLineDefines[Macro]\r
487 if Macro in GlobalData.gGlobalDefines:\r
488 return GlobalData.gGlobalDefines[Macro]\r
489\r
490 if self.__CurSection:\r
491 MacroDict = self.__MacroDict[\r
492 self.__CurSection[0],\r
493 self.__CurSection[1],\r
494 self.__CurSection[2]\r
495 ]\r
496 if MacroDict and Macro in MacroDict:\r
497 return MacroDict[Macro]\r
498\r
499 # Lowest priority\r
500 if Macro in GlobalData.gPlatformDefines:\r
501 return GlobalData.gPlatformDefines[Macro]\r
502 return None\r
503\r
504 def __SectionHeaderParser(self, Section):\r
505 # [Defines]\r
506 # [FD.UiName]: use dummy instead if UI name is optional\r
507 # [FV.UiName]\r
508 # [Capsule.UiName]\r
509 # [Rule]: don't take rule section into account, macro is not allowed in this section\r
510 # [VTF.arch.UiName, arch]\r
511 # [OptionRom.DriverName]\r
512 self.__CurSection = []\r
513 Section = Section.strip()[1:-1].upper().replace(' ', '').strip('.')\r
514 ItemList = Section.split('.')\r
515 Item = ItemList[0]\r
516 if Item == '' or Item == 'RULE':\r
517 return\r
518\r
55c84777
CJ
519 if Item == TAB_COMMON_DEFINES.upper():\r
520 self.__CurSection = [TAB_COMMON, TAB_COMMON, TAB_COMMON]\r
d0acc87a
LG
521 elif Item == 'VTF' and len(ItemList) == 3:\r
522 UiName = ItemList[2]\r
523 Pos = UiName.find(',')\r
524 if Pos != -1:\r
525 UiName = UiName[:Pos]\r
526 self.__CurSection = ['VTF', UiName, ItemList[1]]\r
527 elif len(ItemList) > 1:\r
55c84777 528 self.__CurSection = [ItemList[0], ItemList[1], TAB_COMMON]\r
d0acc87a 529 elif len(ItemList) > 0:\r
55c84777 530 self.__CurSection = [ItemList[0], 'DUMMY', TAB_COMMON]\r
d0acc87a 531\r
30fdf114
LG
532 ## PreprocessFile() method\r
533 #\r
534 # Preprocess file contents, replace comments with spaces.\r
535 # In the end, rewind the file buffer pointer to the beginning\r
536 # BUGBUG: No !include statement processing contained in this procedure\r
537 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]\r
538 #\r
539 # @param self The object pointer\r
540 #\r
541 def PreprocessFile(self):\r
542\r
543 self.Rewind()\r
544 InComment = False\r
545 DoubleSlashComment = False\r
546 HashComment = False\r
547 # HashComment in quoted string " " is ignored.\r
548 InString = False\r
549\r
550 while not self.__EndOfFile():\r
551\r
552 if self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE and not InComment:\r
553 InString = not InString\r
554 # meet new line, then no longer in a comment for // and '#'\r
555 if self.__CurrentChar() == T_CHAR_LF:\r
556 self.CurrentLineNumber += 1\r
557 self.CurrentOffsetWithinLine = 0\r
558 if InComment and DoubleSlashComment:\r
559 InComment = False\r
560 DoubleSlashComment = False\r
561 if InComment and HashComment:\r
562 InComment = False\r
563 HashComment = False\r
564 # check for */ comment end\r
565 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
566 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
567 self.__GetOneChar()\r
568 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
569 self.__GetOneChar()\r
570 InComment = False\r
571 # set comments to spaces\r
572 elif InComment:\r
573 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
574 self.__GetOneChar()\r
575 # check for // comment\r
576 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH and not self.__EndOfLine():\r
577 InComment = True\r
578 DoubleSlashComment = True\r
579 # check for '#' comment\r
580 elif self.__CurrentChar() == T_CHAR_HASH and not self.__EndOfLine() and not InString:\r
581 InComment = True\r
582 HashComment = True\r
583 # check for /* comment start\r
584 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
585 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
586 self.__GetOneChar()\r
587 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
588 self.__GetOneChar()\r
589 InComment = True\r
590 else:\r
591 self.__GetOneChar()\r
592\r
593 # restore from ListOfList to ListOfString\r
594 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
595 self.Rewind()\r
596\r
597 ## PreprocessIncludeFile() method\r
598 #\r
599 # Preprocess file contents, replace !include statements with file contents.\r
600 # In the end, rewind the file buffer pointer to the beginning\r
601 #\r
602 # @param self The object pointer\r
603 #\r
604 def PreprocessIncludeFile(self):\r
f7496d71 605 # nested include support\r
118bf096 606 Processed = False\r
0fdfe274 607 MacroDict = {}\r
30fdf114
LG
608 while self.__GetNextToken():\r
609\r
0fdfe274
YZ
610 if self.__Token == 'DEFINE':\r
611 if not self.__GetNextToken():\r
612 raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
613 Macro = self.__Token\r
614 if not self.__IsToken( "="):\r
615 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
616 Value = self.__GetExpression()\r
617 MacroDict[Macro] = Value\r
618\r
619 elif self.__Token == '!include':\r
118bf096 620 Processed = True\r
30fdf114
LG
621 IncludeLine = self.CurrentLineNumber\r
622 IncludeOffset = self.CurrentOffsetWithinLine - len('!include')\r
623 if not self.__GetNextToken():\r
624 raise Warning("expected include file name", self.FileName, self.CurrentLineNumber)\r
625 IncFileName = self.__Token\r
0fdfe274
YZ
626 PreIndex = 0\r
627 StartPos = IncFileName.find('$(', PreIndex)\r
628 EndPos = IncFileName.find(')', StartPos+2)\r
629 while StartPos != -1 and EndPos != -1:\r
630 Macro = IncFileName[StartPos+2 : EndPos]\r
d0acc87a 631 MacroVal = self.__GetMacroValue(Macro)\r
0fdfe274
YZ
632 if not MacroVal:\r
633 if Macro in MacroDict:\r
634 MacroVal = MacroDict[Macro]\r
4231a819 635 if MacroVal is not None:\r
0fdfe274
YZ
636 IncFileName = IncFileName.replace('$(' + Macro + ')', MacroVal, 1)\r
637 if MacroVal.find('$(') != -1:\r
638 PreIndex = StartPos\r
639 else:\r
640 PreIndex = StartPos + len(MacroVal)\r
641 else:\r
642 raise Warning("The Macro %s is not defined" %Macro, self.FileName, self.CurrentLineNumber)\r
643 StartPos = IncFileName.find('$(', PreIndex)\r
644 EndPos = IncFileName.find(')', StartPos+2)\r
645\r
646 IncludedFile = NormPath(IncFileName)\r
2bcc713e
LG
647 #\r
648 # First search the include file under the same directory as FDF file\r
649 #\r
650 IncludedFile1 = PathClass(IncludedFile, os.path.dirname(self.FileName))\r
651 ErrorCode = IncludedFile1.Validate()[0]\r
652 if ErrorCode != 0:\r
653 #\r
654 # Then search the include file under the same directory as DSC file\r
655 #\r
d0acc87a
LG
656 PlatformDir = ''\r
657 if GenFdsGlobalVariable.ActivePlatform:\r
658 PlatformDir = GenFdsGlobalVariable.ActivePlatform.Dir\r
659 elif GlobalData.gActivePlatform:\r
660 PlatformDir = GlobalData.gActivePlatform.MetaFile.Dir\r
661 IncludedFile1 = PathClass(IncludedFile, PlatformDir)\r
2bcc713e
LG
662 ErrorCode = IncludedFile1.Validate()[0]\r
663 if ErrorCode != 0:\r
664 #\r
665 # Also search file under the WORKSPACE directory\r
666 #\r
667 IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace)\r
668 ErrorCode = IncludedFile1.Validate()[0]\r
669 if ErrorCode != 0:\r
f7496d71 670 raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), PlatformDir, GlobalData.gWorkspace),\r
2bcc713e 671 self.FileName, self.CurrentLineNumber)\r
30fdf114 672\r
118bf096
CS
673 if not IsValidInclude (IncludedFile1.Path, self.CurrentLineNumber):\r
674 raise Warning("The include file {0} is causing a include loop.\n".format (IncludedFile1.Path), self.FileName, self.CurrentLineNumber)\r
675\r
2bcc713e 676 IncFileProfile = IncludeFileProfile(IncludedFile1.Path)\r
30fdf114
LG
677\r
678 CurrentLine = self.CurrentLineNumber\r
679 CurrentOffset = self.CurrentOffsetWithinLine\r
680 # list index of the insertion, note that line number is 'CurrentLine + 1'\r
681 InsertAtLine = CurrentLine\r
118bf096 682 ParentProfile = GetParentAtLine (CurrentLine)\r
4231a819 683 if ParentProfile is not None:\r
118bf096
CS
684 ParentProfile.IncludeFileList.insert(0, IncFileProfile)\r
685 IncFileProfile.Level = ParentProfile.Level + 1\r
30fdf114
LG
686 IncFileProfile.InsertStartLineNumber = InsertAtLine + 1\r
687 # deal with remaining portions after "!include filename", if exists.\r
688 if self.__GetNextToken():\r
689 if self.CurrentLineNumber == CurrentLine:\r
690 RemainingLine = self.__CurrentLine()[CurrentOffset:]\r
691 self.Profile.FileLinesList.insert(self.CurrentLineNumber, RemainingLine)\r
692 IncFileProfile.InsertAdjust += 1\r
693 self.CurrentLineNumber += 1\r
694 self.CurrentOffsetWithinLine = 0\r
695\r
696 for Line in IncFileProfile.FileLinesList:\r
697 self.Profile.FileLinesList.insert(InsertAtLine, Line)\r
698 self.CurrentLineNumber += 1\r
699 InsertAtLine += 1\r
700\r
118bf096
CS
701 # reversely sorted to better determine error in file\r
702 AllIncludeFileList.insert(0, IncFileProfile)\r
30fdf114
LG
703\r
704 # comment out the processed include file statement\r
705 TempList = list(self.Profile.FileLinesList[IncludeLine - 1])\r
706 TempList.insert(IncludeOffset, '#')\r
707 self.Profile.FileLinesList[IncludeLine - 1] = ''.join(TempList)\r
118bf096
CS
708 if Processed: # Nested and back-to-back support\r
709 self.Rewind(DestLine = IncFileProfile.InsertStartLineNumber - 1)\r
710 Processed = False\r
711 # Preprocess done.\r
30fdf114 712 self.Rewind()\r
f7496d71 713\r
5bcf1d56
CJ
714 @staticmethod\r
715 def __GetIfListCurrentItemStat(IfList):\r
da92f276
LG
716 if len(IfList) == 0:\r
717 return True\r
f7496d71 718\r
da92f276
LG
719 for Item in IfList:\r
720 if Item[1] == False:\r
721 return False\r
f7496d71 722\r
da92f276 723 return True\r
f7496d71 724\r
6780eef1 725 ## PreprocessConditionalStatement() method\r
30fdf114 726 #\r
6780eef1 727 # Preprocess conditional statement.\r
30fdf114
LG
728 # In the end, rewind the file buffer pointer to the beginning\r
729 #\r
730 # @param self The object pointer\r
731 #\r
732 def PreprocessConditionalStatement(self):\r
733 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]\r
734 IfList = []\r
0d2711a6 735 RegionLayoutLine = 0\r
d0acc87a 736 ReplacedLine = -1\r
30fdf114 737 while self.__GetNextToken():\r
d0acc87a
LG
738 # Determine section name and the location dependent macro\r
739 if self.__GetIfListCurrentItemStat(IfList):\r
740 if self.__Token.startswith('['):\r
741 Header = self.__Token\r
742 if not self.__Token.endswith(']'):\r
743 self.__SkipToToken(']')\r
744 Header += self.__SkippedChars\r
745 if Header.find('$(') != -1:\r
746 raise Warning("macro cannot be used in section header", self.FileName, self.CurrentLineNumber)\r
747 self.__SectionHeaderParser(Header)\r
748 continue\r
749 # Replace macros except in RULE section or out of section\r
750 elif self.__CurSection and ReplacedLine != self.CurrentLineNumber:\r
751 ReplacedLine = self.CurrentLineNumber\r
752 self.__UndoToken()\r
753 CurLine = self.Profile.FileLinesList[ReplacedLine - 1]\r
754 PreIndex = 0\r
755 StartPos = CurLine.find('$(', PreIndex)\r
756 EndPos = CurLine.find(')', StartPos+2)\r
64b2609f 757 while StartPos != -1 and EndPos != -1 and self.__Token not in ['!ifdef', '!ifndef', '!if', '!elseif']:\r
d0acc87a
LG
758 MacroName = CurLine[StartPos+2 : EndPos]\r
759 MacorValue = self.__GetMacroValue(MacroName)\r
4231a819 760 if MacorValue is not None:\r
d0acc87a
LG
761 CurLine = CurLine.replace('$(' + MacroName + ')', MacorValue, 1)\r
762 if MacorValue.find('$(') != -1:\r
763 PreIndex = StartPos\r
764 else:\r
765 PreIndex = StartPos + len(MacorValue)\r
766 else:\r
767 PreIndex = EndPos + 1\r
768 StartPos = CurLine.find('$(', PreIndex)\r
769 EndPos = CurLine.find(')', StartPos+2)\r
770 self.Profile.FileLinesList[ReplacedLine - 1] = CurLine\r
771 continue\r
772\r
30fdf114 773 if self.__Token == 'DEFINE':\r
d0acc87a
LG
774 if self.__GetIfListCurrentItemStat(IfList):\r
775 if not self.__CurSection:\r
776 raise Warning("macro cannot be defined in Rule section or out of section", self.FileName, self.CurrentLineNumber)\r
da92f276
LG
777 DefineLine = self.CurrentLineNumber - 1\r
778 DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE')\r
779 if not self.__GetNextToken():\r
780 raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
781 Macro = self.__Token\r
782 if not self.__IsToken( "="):\r
783 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
f7496d71 784\r
d0acc87a
LG
785 Value = self.__GetExpression()\r
786 self.__SetMacroValue(Macro, Value)\r
da92f276 787 self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
0d2711a6 788 elif self.__Token == 'SET':\r
2f04e527
YL
789 if not self.__GetIfListCurrentItemStat(IfList):\r
790 continue\r
64b2609f
LG
791 SetLine = self.CurrentLineNumber - 1\r
792 SetOffset = self.CurrentOffsetWithinLine - len('SET')\r
543f5ac3 793 PcdPair = self.__GetNextPcdSettings()\r
0d2711a6
LG
794 PcdName = "%s.%s" % (PcdPair[1], PcdPair[0])\r
795 if not self.__IsToken( "="):\r
796 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
797\r
d0acc87a
LG
798 Value = self.__GetExpression()\r
799 Value = self.__EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True)\r
30fdf114 800\r
d0acc87a 801 self.__PcdDict[PcdName] = Value\r
64b2609f
LG
802\r
803 self.Profile.PcdDict[PcdPair] = Value\r
543f5ac3 804 self.SetPcdLocalation(PcdPair)\r
64b2609f
LG
805 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
806 self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
807\r
808 self.__WipeOffArea.append(((SetLine, SetOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
30fdf114
LG
809 elif self.__Token in ('!ifdef', '!ifndef', '!if'):\r
810 IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
811 IfList.append([IfStartPos, None, None])\r
0d2711a6 812\r
30fdf114 813 CondLabel = self.__Token\r
0d2711a6 814 Expression = self.__GetExpression()\r
f7496d71 815\r
30fdf114 816 if CondLabel == '!if':\r
0d2711a6 817 ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval')\r
30fdf114 818 else:\r
0d2711a6
LG
819 ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'in')\r
820 if CondLabel == '!ifndef':\r
30fdf114 821 ConditionSatisfied = not ConditionSatisfied\r
30fdf114 822\r
0d2711a6
LG
823 BranchDetermined = ConditionSatisfied\r
824 IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]\r
825 if ConditionSatisfied:\r
f7496d71 826 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
30fdf114
LG
827 elif self.__Token in ('!elseif', '!else'):\r
828 ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
829 if len(IfList) <= 0:\r
830 raise Warning("Missing !if statement", self.FileName, self.CurrentLineNumber)\r
0d2711a6 831\r
30fdf114
LG
832 if IfList[-1][1]:\r
833 IfList[-1] = [ElseStartPos, False, True]\r
834 self.__WipeOffArea.append((ElseStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
835 else:\r
836 self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))\r
837 IfList[-1] = [ElseStartPos, True, IfList[-1][2]]\r
838 if self.__Token == '!elseif':\r
0d2711a6
LG
839 Expression = self.__GetExpression()\r
840 ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval')\r
30fdf114
LG
841 IfList[-1] = [IfList[-1][0], ConditionSatisfied, IfList[-1][2]]\r
842\r
843 if IfList[-1][1]:\r
844 if IfList[-1][2]:\r
845 IfList[-1][1] = False\r
846 else:\r
847 IfList[-1][2] = True\r
848 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
30fdf114 849 elif self.__Token == '!endif':\r
d0acc87a
LG
850 if len(IfList) <= 0:\r
851 raise Warning("Missing !if statement", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
852 if IfList[-1][1]:\r
853 self.__WipeOffArea.append(((self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len('!endif')), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
854 else:\r
855 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
856\r
857 IfList.pop()\r
0d2711a6
LG
858 elif not IfList: # Don't use PCDs inside conditional directive\r
859 if self.CurrentLineNumber <= RegionLayoutLine:\r
860 # Don't try the same line twice\r
861 continue\r
64b2609f
LG
862 SetPcd = ShortcutPcdPattern.match(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
863 if SetPcd:\r
864 self.__PcdDict[SetPcd.group('name')] = SetPcd.group('value')\r
865 RegionLayoutLine = self.CurrentLineNumber\r
866 continue\r
0d2711a6
LG
867 RegionSize = RegionSizePattern.match(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
868 if not RegionSize:\r
869 RegionLayoutLine = self.CurrentLineNumber\r
870 continue\r
871 RegionSizeGuid = RegionSizeGuidPattern.match(self.Profile.FileLinesList[self.CurrentLineNumber])\r
872 if not RegionSizeGuid:\r
873 RegionLayoutLine = self.CurrentLineNumber + 1\r
874 continue\r
d0acc87a
LG
875 self.__PcdDict[RegionSizeGuid.group('base')] = RegionSize.group('base')\r
876 self.__PcdDict[RegionSizeGuid.group('size')] = RegionSize.group('size')\r
0d2711a6
LG
877 RegionLayoutLine = self.CurrentLineNumber + 1\r
878\r
879 if IfList:\r
30fdf114
LG
880 raise Warning("Missing !endif", self.FileName, self.CurrentLineNumber)\r
881 self.Rewind()\r
882\r
d0acc87a
LG
883 def __CollectMacroPcd(self):\r
884 MacroDict = {}\r
885\r
886 # PCD macro\r
64b2609f 887 MacroDict.update(GlobalData.gPlatformPcds)\r
d0acc87a
LG
888 MacroDict.update(self.__PcdDict)\r
889\r
890 # Lowest priority\r
891 MacroDict.update(GlobalData.gPlatformDefines)\r
892\r
893 if self.__CurSection:\r
894 # Defines macro\r
55c84777 895 ScopeMacro = self.__MacroDict[TAB_COMMON, TAB_COMMON, TAB_COMMON]\r
d0acc87a
LG
896 if ScopeMacro:\r
897 MacroDict.update(ScopeMacro)\r
f7496d71 898\r
d0acc87a
LG
899 # Section macro\r
900 ScopeMacro = self.__MacroDict[\r
901 self.__CurSection[0],\r
902 self.__CurSection[1],\r
903 self.__CurSection[2]\r
904 ]\r
905 if ScopeMacro:\r
906 MacroDict.update(ScopeMacro)\r
907\r
908 MacroDict.update(GlobalData.gGlobalDefines)\r
909 MacroDict.update(GlobalData.gCommandLineDefines)\r
1fa7fdf6
FY
910 if GlobalData.BuildOptionPcd:\r
911 for Item in GlobalData.BuildOptionPcd:\r
0d1f5b2b 912 if isinstance(Item, tuple):\r
705ed563 913 continue\r
1fa7fdf6 914 PcdName, TmpValue = Item.split("=")\r
8565b582 915 TmpValue = BuildOptionValue(TmpValue, {})\r
1fa7fdf6 916 MacroDict[PcdName.strip()] = TmpValue\r
d0acc87a
LG
917 # Highest priority\r
918\r
919 return MacroDict\r
920\r
0d2711a6 921 def __EvaluateConditional(self, Expression, Line, Op = None, Value = None):\r
d0acc87a 922 MacroPcdDict = self.__CollectMacroPcd()\r
0d2711a6
LG
923 if Op == 'eval':\r
924 try:\r
d0acc87a
LG
925 if Value:\r
926 return ValueExpression(Expression, MacroPcdDict)(True)\r
927 else:\r
928 return ValueExpression(Expression, MacroPcdDict)()\r
5b0671c1 929 except WrnExpression as Excpt:\r
f7496d71 930 #\r
0d2711a6
LG
931 # Catch expression evaluation warning here. We need to report\r
932 # the precise number of line and return the evaluation result\r
933 #\r
934 EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt),\r
f7496d71 935 File=self.FileName, ExtraData=self.__CurrentLine(),\r
0d2711a6
LG
936 Line=Line)\r
937 return Excpt.result\r
5b0671c1 938 except Exception as Excpt:\r
64b2609f
LG
939 if hasattr(Excpt, 'Pcd'):\r
940 if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
941 Info = GlobalData.gPlatformOtherPcds[Excpt.Pcd]\r
942 raise Warning("Cannot use this PCD (%s) in an expression as"\r
943 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
944 " of the DSC file (%s), and it is currently defined in this section:"\r
945 " %s, line #: %d." % (Excpt.Pcd, GlobalData.gPlatformOtherPcds['DSCFILE'], Info[0], Info[1]),\r
20274d23 946 self.FileName, Line)\r
64b2609f
LG
947 else:\r
948 raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt.Pcd, GlobalData.gPlatformOtherPcds['DSCFILE']),\r
20274d23 949 self.FileName, Line)\r
64b2609f 950 else:\r
20274d23 951 raise Warning(str(Excpt), self.FileName, Line)\r
0d2711a6
LG
952 else:\r
953 if Expression.startswith('$(') and Expression[-1] == ')':\r
f7496d71 954 Expression = Expression[2:-1]\r
d0acc87a 955 return Expression in MacroPcdDict\r
30fdf114
LG
956\r
957 ## __IsToken() method\r
958 #\r
959 # Check whether input string is found from current char position along\r
960 # If found, the string value is put into self.__Token\r
961 #\r
962 # @param self The object pointer\r
963 # @param String The string to search\r
964 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
965 # @retval True Successfully find string, file buffer pointer moved forward\r
966 # @retval False Not able to find string, file buffer pointer not changed\r
967 #\r
968 def __IsToken(self, String, IgnoreCase = False):\r
969 self.__SkipWhiteSpace()\r
970\r
971 # Only consider the same line, no multi-line token allowed\r
972 StartPos = self.CurrentOffsetWithinLine\r
973 index = -1\r
974 if IgnoreCase:\r
975 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper())\r
976 else:\r
977 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)\r
978 if index == 0:\r
979 self.CurrentOffsetWithinLine += len(String)\r
980 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
981 return True\r
982 return False\r
983\r
984 ## __IsKeyword() method\r
985 #\r
986 # Check whether input keyword is found from current char position along, whole word only!\r
987 # If found, the string value is put into self.__Token\r
988 #\r
989 # @param self The object pointer\r
990 # @param Keyword The string to search\r
991 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
992 # @retval True Successfully find string, file buffer pointer moved forward\r
993 # @retval False Not able to find string, file buffer pointer not changed\r
994 #\r
995 def __IsKeyword(self, KeyWord, IgnoreCase = False):\r
996 self.__SkipWhiteSpace()\r
997\r
998 # Only consider the same line, no multi-line token allowed\r
999 StartPos = self.CurrentOffsetWithinLine\r
1000 index = -1\r
1001 if IgnoreCase:\r
1002 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(KeyWord.upper())\r
1003 else:\r
1004 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(KeyWord)\r
1005 if index == 0:\r
1006 followingChar = self.__CurrentLine()[self.CurrentOffsetWithinLine + len(KeyWord)]\r
1007 if not str(followingChar).isspace() and followingChar not in SEPERATOR_TUPLE:\r
1008 return False\r
1009 self.CurrentOffsetWithinLine += len(KeyWord)\r
1010 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
1011 return True\r
1012 return False\r
1013\r
0d2711a6
LG
1014 def __GetExpression(self):\r
1015 Line = self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
1016 Index = len(Line) - 1\r
1017 while Line[Index] in ['\r', '\n']:\r
1018 Index -= 1\r
1019 ExpressionString = self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:Index+1]\r
1020 self.CurrentOffsetWithinLine += len(ExpressionString)\r
1021 ExpressionString = ExpressionString.strip()\r
1022 return ExpressionString\r
1023\r
30fdf114
LG
1024 ## __GetNextWord() method\r
1025 #\r
1026 # Get next C name from file lines\r
1027 # If found, the string value is put into self.__Token\r
1028 #\r
1029 # @param self The object pointer\r
1030 # @retval True Successfully find a C name string, file buffer pointer moved forward\r
1031 # @retval False Not able to find a C name string, file buffer pointer not changed\r
1032 #\r
1033 def __GetNextWord(self):\r
1034 self.__SkipWhiteSpace()\r
1035 if self.__EndOfFile():\r
1036 return False\r
1037\r
1038 TempChar = self.__CurrentChar()\r
1039 StartPos = self.CurrentOffsetWithinLine\r
1040 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_':\r
1041 self.__GetOneChar()\r
1042 while not self.__EndOfLine():\r
1043 TempChar = self.__CurrentChar()\r
1044 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \\r
1045 or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-':\r
1046 self.__GetOneChar()\r
1047\r
1048 else:\r
1049 break\r
1050\r
1051 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
1052 return True\r
1053\r
1054 return False\r
1055\r
543f5ac3
B
1056 def __GetNextPcdWord(self):\r
1057 self.__SkipWhiteSpace()\r
1058 if self.__EndOfFile():\r
1059 return False\r
1060\r
1061 TempChar = self.__CurrentChar()\r
1062 StartPos = self.CurrentOffsetWithinLine\r
1063 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_' or TempChar == '[' or TempChar == ']':\r
1064 self.__GetOneChar()\r
1065 while not self.__EndOfLine():\r
1066 TempChar = self.__CurrentChar()\r
1067 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \\r
1068 or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-' or TempChar == '[' or TempChar == ']':\r
1069 self.__GetOneChar()\r
1070\r
1071 else:\r
1072 break\r
1073\r
1074 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
1075 return True\r
1076\r
1077 return False\r
1078\r
30fdf114
LG
1079 ## __GetNextToken() method\r
1080 #\r
1081 # Get next token unit before a seperator\r
1082 # If found, the string value is put into self.__Token\r
1083 #\r
1084 # @param self The object pointer\r
1085 # @retval True Successfully find a token unit, file buffer pointer moved forward\r
1086 # @retval False Not able to find a token unit, file buffer pointer not changed\r
1087 #\r
1088 def __GetNextToken(self):\r
1089 # Skip leading spaces, if exist.\r
1090 self.__SkipWhiteSpace()\r
1091 if self.__EndOfFile():\r
1092 return False\r
1093 # Record the token start position, the position of the first non-space char.\r
1094 StartPos = self.CurrentOffsetWithinLine\r
1095 StartLine = self.CurrentLineNumber\r
d0acc87a 1096 while StartLine == self.CurrentLineNumber:\r
30fdf114
LG
1097 TempChar = self.__CurrentChar()\r
1098 # Try to find the end char that is not a space and not in seperator tuple.\r
1099 # That is, when we got a space or any char in the tuple, we got the end of token.\r
1100 if not str(TempChar).isspace() and TempChar not in SEPERATOR_TUPLE:\r
1101 self.__GetOneChar()\r
1102 # if we happen to meet a seperator as the first char, we must proceed to get it.\r
1103 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
1104 elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:\r
1105 self.__GetOneChar()\r
1106 break\r
1107 else:\r
1108 break\r
1109# else:\r
1110# return False\r
1111\r
1112 EndPos = self.CurrentOffsetWithinLine\r
1113 if self.CurrentLineNumber != StartLine:\r
1114 EndPos = len(self.Profile.FileLinesList[StartLine-1])\r
1115 self.__Token = self.Profile.FileLinesList[StartLine-1][StartPos : EndPos]\r
865d7f7b 1116 if self.__Token.lower() in [TAB_IF, TAB_END_IF, TAB_ELSE_IF, TAB_ELSE, TAB_IF_DEF, TAB_IF_N_DEF, TAB_ERROR, TAB_INCLUDE]:\r
1117 self.__Token = self.__Token.lower()\r
30fdf114
LG
1118 if StartPos != self.CurrentOffsetWithinLine:\r
1119 return True\r
1120 else:\r
1121 return False\r
1122\r
1123 def __GetNextOp(self):\r
1124 # Skip leading spaces, if exist.\r
1125 self.__SkipWhiteSpace()\r
1126 if self.__EndOfFile():\r
1127 return False\r
1128 # Record the token start position, the position of the first non-space char.\r
1129 StartPos = self.CurrentOffsetWithinLine\r
1130 while not self.__EndOfLine():\r
1131 TempChar = self.__CurrentChar()\r
1132 # Try to find the end char that is not a space\r
1133 if not str(TempChar).isspace():\r
1134 self.__GetOneChar()\r
1135 else:\r
1136 break\r
1137 else:\r
1138 return False\r
1139\r
1140 if StartPos != self.CurrentOffsetWithinLine:\r
1141 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
1142 return True\r
1143 else:\r
1144 return False\r
1145 ## __GetNextGuid() method\r
1146 #\r
1147 # Get next token unit before a seperator\r
1148 # If found, the GUID string is put into self.__Token\r
1149 #\r
1150 # @param self The object pointer\r
1151 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward\r
1152 # @retval False Not able to find a registry format GUID, file buffer pointer not changed\r
1153 #\r
1154 def __GetNextGuid(self):\r
1155\r
1156 if not self.__GetNextToken():\r
1157 return False\r
4231a819 1158 if gGuidPattern.match(self.__Token) is not None:\r
30fdf114
LG
1159 return True\r
1160 else:\r
1161 self.__UndoToken()\r
1162 return False\r
1163\r
227dbb11
CJ
1164 @staticmethod\r
1165 def __Verify(Name, Value, Scope):\r
bff74750 1166 # value verification only applies to numeric values.\r
053cd183 1167 if Scope not in TAB_PCD_NUMERIC_TYPES:\r
bff74750
CJ
1168 return\r
1169\r
1170 ValueNumber = 0\r
1171 try:\r
1172 ValueNumber = int(Value, 0)\r
1173 except:\r
1174 EdkLogger.error("FdfParser", FORMAT_INVALID, "The value is not valid dec or hex number for %s." % Name)\r
1175 if ValueNumber < 0:\r
1176 EdkLogger.error("FdfParser", FORMAT_INVALID, "The value can't be set to negative value for %s." % Name)\r
1177 if ValueNumber > MAX_VAL_TYPE[Scope]:\r
1178 EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
1179 return True\r
91ae2988 1180\r
30fdf114
LG
1181 ## __UndoToken() method\r
1182 #\r
1183 # Go back one token unit in file buffer\r
1184 #\r
1185 # @param self The object pointer\r
1186 #\r
1187 def __UndoToken(self):\r
1188 self.__UndoOneChar()\r
1189 while self.__CurrentChar().isspace():\r
1190 if not self.__UndoOneChar():\r
1191 self.__GetOneChar()\r
1192 return\r
1193\r
1194\r
1195 StartPos = self.CurrentOffsetWithinLine\r
1196 CurrentLine = self.CurrentLineNumber\r
1197 while CurrentLine == self.CurrentLineNumber:\r
1198\r
1199 TempChar = self.__CurrentChar()\r
1200 # Try to find the end char that is not a space and not in seperator tuple.\r
1201 # That is, when we got a space or any char in the tuple, we got the end of token.\r
1202 if not str(TempChar).isspace() and not TempChar in SEPERATOR_TUPLE:\r
1203 if not self.__UndoOneChar():\r
d0acc87a 1204 return\r
30fdf114
LG
1205 # if we happen to meet a seperator as the first char, we must proceed to get it.\r
1206 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
1207 elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:\r
1208 return\r
1209 else:\r
1210 break\r
1211\r
1212 self.__GetOneChar()\r
1213\r
30fdf114
LG
1214 ## __GetNextHexNumber() method\r
1215 #\r
1216 # Get next HEX data before a seperator\r
1217 # If found, the HEX data is put into self.__Token\r
1218 #\r
1219 # @param self The object pointer\r
1220 # @retval True Successfully find a HEX data, file buffer pointer moved forward\r
1221 # @retval False Not able to find a HEX data, file buffer pointer not changed\r
1222 #\r
1223 def __GetNextHexNumber(self):\r
1224 if not self.__GetNextToken():\r
1225 return False\r
6553c617 1226 if gHexPatternAll.match(self.__Token):\r
30fdf114
LG
1227 return True\r
1228 else:\r
1229 self.__UndoToken()\r
1230 return False\r
1231\r
1232 ## __GetNextDecimalNumber() method\r
1233 #\r
1234 # Get next decimal data before a seperator\r
1235 # If found, the decimal data is put into self.__Token\r
1236 #\r
1237 # @param self The object pointer\r
1238 # @retval True Successfully find a decimal data, file buffer pointer moved forward\r
1239 # @retval False Not able to find a decimal data, file buffer pointer not changed\r
1240 #\r
1241 def __GetNextDecimalNumber(self):\r
1242 if not self.__GetNextToken():\r
1243 return False\r
1244 if self.__Token.isdigit():\r
1245 return True\r
1246 else:\r
1247 self.__UndoToken()\r
1248 return False\r
1249\r
1250 ## __GetNextPcdName() method\r
1251 #\r
1252 # Get next PCD token space C name and PCD C name pair before a seperator\r
1253 # If found, the decimal data is put into self.__Token\r
1254 #\r
1255 # @param self The object pointer\r
1256 # @retval Tuple PCD C name and PCD token space C name pair\r
1257 #\r
1258 def __GetNextPcdName(self):\r
1259 if not self.__GetNextWord():\r
1260 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1261 pcdTokenSpaceCName = self.__Token\r
1262\r
1263 if not self.__IsToken( "."):\r
1264 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1265\r
1266 if not self.__GetNextWord():\r
1267 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1268 pcdCName = self.__Token\r
1269\r
1270 return (pcdCName, pcdTokenSpaceCName)\r
1271\r
543f5ac3
B
1272 def __GetNextPcdSettings(self):\r
1273 if not self.__GetNextWord():\r
1274 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1275 pcdTokenSpaceCName = self.__Token\r
1276\r
1277 if not self.__IsToken( "."):\r
1278 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1279\r
1280 if not self.__GetNextWord():\r
1281 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1282 pcdCName = self.__Token\r
1283\r
1284 Fields = []\r
1285 while self.__IsToken("."):\r
1286 if not self.__GetNextPcdWord():\r
1287 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1288 Fields.append(self.__Token)\r
1289\r
1290 return (pcdCName, pcdTokenSpaceCName,".".join(Fields))\r
1291\r
30fdf114
LG
1292 ## __GetStringData() method\r
1293 #\r
1294 # Get string contents quoted in ""\r
1295 # If found, the decimal data is put into self.__Token\r
1296 #\r
1297 # @param self The object pointer\r
1298 # @retval True Successfully find a string data, file buffer pointer moved forward\r
1299 # @retval False Not able to find a string data, file buffer pointer not changed\r
1300 #\r
1301 def __GetStringData(self):\r
1302 if self.__Token.startswith("\"") or self.__Token.startswith("L\""):\r
1303 self.__UndoToken()\r
1304 self.__SkipToToken("\"")\r
1305 currentLineNumber = self.CurrentLineNumber\r
1306\r
1307 if not self.__SkipToToken("\""):\r
1308 raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber)\r
1309 if currentLineNumber != self.CurrentLineNumber:\r
1310 raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber)\r
1311 self.__Token = self.__SkippedChars.rstrip('\"')\r
1312 return True\r
1313\r
1314 elif self.__Token.startswith("\'") or self.__Token.startswith("L\'"):\r
1315 self.__UndoToken()\r
1316 self.__SkipToToken("\'")\r
1317 currentLineNumber = self.CurrentLineNumber\r
1318\r
1319 if not self.__SkipToToken("\'"):\r
1320 raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber)\r
1321 if currentLineNumber != self.CurrentLineNumber:\r
1322 raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber)\r
1323 self.__Token = self.__SkippedChars.rstrip('\'')\r
1324 return True\r
1325\r
1326 else:\r
1327 return False\r
1328\r
1329 ## __SkipToToken() method\r
1330 #\r
1331 # Search forward in file buffer for the string\r
1332 # The skipped chars are put into self.__SkippedChars\r
1333 #\r
1334 # @param self The object pointer\r
1335 # @param String The string to search\r
1336 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
1337 # @retval True Successfully find the string, file buffer pointer moved forward\r
1338 # @retval False Not able to find the string, file buffer pointer not changed\r
1339 #\r
1340 def __SkipToToken(self, String, IgnoreCase = False):\r
1341 StartPos = self.GetFileBufferPos()\r
1342\r
1343 self.__SkippedChars = ""\r
1344 while not self.__EndOfFile():\r
1345 index = -1\r
1346 if IgnoreCase:\r
1347 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper())\r
1348 else:\r
1349 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)\r
1350 if index == 0:\r
1351 self.CurrentOffsetWithinLine += len(String)\r
1352 self.__SkippedChars += String\r
1353 return True\r
1354 self.__SkippedChars += str(self.__CurrentChar())\r
1355 self.__GetOneChar()\r
1356\r
1357 self.SetFileBufferPos( StartPos)\r
1358 self.__SkippedChars = ""\r
1359 return False\r
1360\r
1361 ## GetFileBufferPos() method\r
1362 #\r
1363 # Return the tuple of current line and offset within the line\r
1364 #\r
1365 # @param self The object pointer\r
1366 # @retval Tuple Line number and offset pair\r
1367 #\r
1368 def GetFileBufferPos(self):\r
1369 return (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
1370\r
1371 ## SetFileBufferPos() method\r
1372 #\r
1373 # Restore the file buffer position\r
1374 #\r
1375 # @param self The object pointer\r
1376 # @param Pos The new file buffer position\r
1377 #\r
1378 def SetFileBufferPos(self, Pos):\r
1379 (self.CurrentLineNumber, self.CurrentOffsetWithinLine) = Pos\r
1380\r
d40b2ee6
LG
1381 ## Preprocess() method\r
1382 #\r
1383 # Preprocess comment, conditional directive, include directive, replace macro.\r
1384 # Exception will be raised if syntax error found\r
1385 #\r
1386 # @param self The object pointer\r
1387 #\r
1388 def Preprocess(self):\r
1389 self.__StringToList()\r
1390 self.PreprocessFile()\r
1391 self.PreprocessIncludeFile()\r
1392 self.__StringToList()\r
1393 self.PreprocessFile()\r
1394 self.PreprocessConditionalStatement()\r
1395 self.__StringToList()\r
1396 for Pos in self.__WipeOffArea:\r
1397 self.__ReplaceFragment(Pos[0], Pos[1])\r
1398 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
1399\r
1400 while self.__GetDefines():\r
1401 pass\r
d40b2ee6 1402\r
30fdf114
LG
1403 ## ParseFile() method\r
1404 #\r
1405 # Parse the file profile buffer to extract fd, fv ... information\r
1406 # Exception will be raised if syntax error found\r
1407 #\r
1408 # @param self The object pointer\r
1409 #\r
1410 def ParseFile(self):\r
1411\r
1412 try:\r
d40b2ee6 1413 self.Preprocess()\r
09ef8e92 1414 self.__GetError()\r
dd170333
MK
1415 #\r
1416 # Keep processing sections of the FDF until no new sections or a syntax error is found\r
1417 #\r
1418 while self.__GetFd() or self.__GetFv() or self.__GetFmp() or self.__GetCapsule() or self.__GetVtf() or self.__GetRule() or self.__GetOptionRom():\r
30fdf114
LG
1419 pass\r
1420\r
5b0671c1 1421 except Warning as X:\r
30fdf114 1422 self.__UndoToken()\r
30fdf114 1423 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \\r
118bf096
CS
1424 # At this point, the closest parent would be the included file itself\r
1425 Profile = GetParentAtLine(X.OriginalLineNumber)\r
4231a819 1426 if Profile is not None:\r
118bf096
CS
1427 X.Message += ' near line %d, column %d: %s' \\r
1428 % (X.LineNumber, 0, Profile.FileLinesList[X.LineNumber-1])\r
1429 else:\r
1430 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1431 X.Message += ' near line %d, column %d: %s' \\r
30fdf114
LG
1432 % (FileLineTuple[1], self.CurrentOffsetWithinLine + 1, self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :].rstrip('\n').rstrip('\r'))\r
1433 raise\r
1434\r
df81077f
YZ
1435 ## SectionParser() method\r
1436 #\r
1437 # Parse the file section info\r
1438 # Exception will be raised if syntax error found\r
1439 #\r
1440 # @param self The object pointer\r
1441 # @param section The section string\r
1442\r
1443 def SectionParser(self, section):\r
1444 S = section.upper()\r
1445 if not S.startswith("[DEFINES") and not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
1446 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM.") and not S.startswith('[FMPPAYLOAD.'):\r
1447 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.], [FMPPAYLOAD.])", self.FileName, self.CurrentLineNumber)\r
1448\r
30fdf114
LG
1449 ## __GetDefines() method\r
1450 #\r
1451 # Get Defines section contents and store its data into AllMacrosList\r
1452 #\r
1453 # @param self The object pointer\r
1454 # @retval True Successfully find a Defines\r
1455 # @retval False Not able to find a Defines\r
1456 #\r
1457 def __GetDefines(self):\r
1458\r
1459 if not self.__GetNextToken():\r
1460 return False\r
1461\r
1462 S = self.__Token.upper()\r
1463 if S.startswith("[") and not S.startswith("[DEFINES"):\r
df81077f 1464 self.SectionParser(S)\r
30fdf114
LG
1465 self.__UndoToken()\r
1466 return False\r
1467\r
1468 self.__UndoToken()\r
1469 if not self.__IsToken("[DEFINES", True):\r
1470 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1471 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1472 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1473 raise Warning("expected [DEFINES", self.FileName, self.CurrentLineNumber)\r
1474\r
1475 if not self.__IsToken( "]"):\r
1476 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1477\r
1478 while self.__GetNextWord():\r
6780eef1
LG
1479 # handle the SET statement\r
1480 if self.__Token == 'SET':\r
1481 self.__UndoToken()\r
1482 self.__GetSetStatement(None)\r
1483 continue\r
f7496d71 1484\r
30fdf114 1485 Macro = self.__Token\r
f7496d71 1486\r
30fdf114
LG
1487 if not self.__IsToken("="):\r
1488 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1489 if not self.__GetNextToken() or self.__Token.startswith('['):\r
1490 raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber)\r
1491 Value = self.__Token\r
30fdf114
LG
1492\r
1493 return False\r
1494\r
09ef8e92
YF
1495 ##__GetError() method\r
1496 def __GetError(self):\r
1497 #save the Current information\r
1498 CurrentLine = self.CurrentLineNumber\r
1499 CurrentOffset = self.CurrentOffsetWithinLine\r
1500 while self.__GetNextToken():\r
1501 if self.__Token == TAB_ERROR:\r
1502 EdkLogger.error('FdfParser', ERROR_STATEMENT, self.__CurrentLine().replace(TAB_ERROR, '', 1), File=self.FileName, Line=self.CurrentLineNumber)\r
1503 self.CurrentLineNumber = CurrentLine\r
1504 self.CurrentOffsetWithinLine = CurrentOffset\r
1505\r
30fdf114
LG
1506 ## __GetFd() method\r
1507 #\r
1508 # Get FD section contents and store its data into FD dictionary of self.Profile\r
1509 #\r
1510 # @param self The object pointer\r
1511 # @retval True Successfully find a FD\r
1512 # @retval False Not able to find a FD\r
1513 #\r
1514 def __GetFd(self):\r
1515\r
1516 if not self.__GetNextToken():\r
1517 return False\r
1518\r
1519 S = self.__Token.upper()\r
1520 if S.startswith("[") and not S.startswith("[FD."):\r
a3251d84 1521 if not S.startswith("[FV.") and not S.startswith('[FMPPAYLOAD.') and not S.startswith("[CAPSULE.") \\r
30fdf114
LG
1522 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
1523 raise Warning("Unknown section", self.FileName, self.CurrentLineNumber)\r
1524 self.__UndoToken()\r
1525 return False\r
1526\r
1527 self.__UndoToken()\r
1528 if not self.__IsToken("[FD.", True):\r
1529 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1530 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1531 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1532 raise Warning("expected [FD.]", self.FileName, self.CurrentLineNumber)\r
1533\r
1534 FdName = self.__GetUiName()\r
52302d4d
LG
1535 if FdName == "":\r
1536 if len (self.Profile.FdDict) == 0:\r
1537 FdName = GenFdsGlobalVariable.PlatformName\r
d0acc87a
LG
1538 if FdName == "" and GlobalData.gActivePlatform:\r
1539 FdName = GlobalData.gActivePlatform.PlatformName\r
52302d4d
LG
1540 self.Profile.FdNameNotSet = True\r
1541 else:\r
1542 raise Warning("expected FdName in [FD.] section", self.FileName, self.CurrentLineNumber)\r
30fdf114 1543 self.CurrentFdName = FdName.upper()\r
f7496d71 1544\r
52302d4d
LG
1545 if self.CurrentFdName in self.Profile.FdDict:\r
1546 raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1547\r
1548 if not self.__IsToken( "]"):\r
1549 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1550\r
1551 FdObj = Fd.FD()\r
1552 FdObj.FdUiName = self.CurrentFdName\r
1553 self.Profile.FdDict[self.CurrentFdName] = FdObj\r
52302d4d
LG
1554\r
1555 if len (self.Profile.FdDict) > 1 and self.Profile.FdNameNotSet:\r
1556 raise Warning("expected all FDs have their name", self.FileName, self.CurrentLineNumber)\r
1557\r
30fdf114
LG
1558 Status = self.__GetCreateFile(FdObj)\r
1559 if not Status:\r
1560 raise Warning("FD name error", self.FileName, self.CurrentLineNumber)\r
1561\r
e8a47801
LG
1562 while self.__GetTokenStatements(FdObj):\r
1563 pass\r
1564 for Attr in ("BaseAddress", "Size", "ErasePolarity"):\r
4231a819 1565 if getattr(FdObj, Attr) is None:\r
e8a47801
LG
1566 self.__GetNextToken()\r
1567 raise Warning("Keyword %s missing" % Attr, self.FileName, self.CurrentLineNumber)\r
1568\r
1569 if not FdObj.BlockSizeList:\r
1570 FdObj.BlockSizeList.append((1, FdObj.Size, None))\r
30fdf114
LG
1571\r
1572 self.__GetDefineStatements(FdObj)\r
1573\r
1574 self.__GetSetStatements(FdObj)\r
1575\r
1576 if not self.__GetRegionLayout(FdObj):\r
1577 raise Warning("expected region layout", self.FileName, self.CurrentLineNumber)\r
1578\r
1579 while self.__GetRegionLayout(FdObj):\r
1580 pass\r
1581 return True\r
1582\r
1583 ## __GetUiName() method\r
1584 #\r
1585 # Return the UI name of a section\r
1586 #\r
1587 # @param self The object pointer\r
1588 # @retval FdName UI name\r
1589 #\r
1590 def __GetUiName(self):\r
1591 Name = ""\r
1592 if self.__GetNextWord():\r
1593 Name = self.__Token\r
1594\r
1595 return Name\r
1596\r
1597 ## __GetCreateFile() method\r
1598 #\r
1599 # Return the output file name of object\r
1600 #\r
1601 # @param self The object pointer\r
1602 # @param Obj object whose data will be stored in file\r
1603 # @retval FdName UI name\r
1604 #\r
1605 def __GetCreateFile(self, Obj):\r
1606\r
1607 if self.__IsKeyword( "CREATE_FILE"):\r
1608 if not self.__IsToken( "="):\r
1609 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1610\r
1611 if not self.__GetNextToken():\r
1612 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
1613\r
1614 FileName = self.__Token\r
1615 Obj.CreateFileName = FileName\r
1616\r
1617 return True\r
1618\r
543f5ac3
B
1619 def SetPcdLocalation(self,pcdpair):\r
1620 self.Profile.PcdLocalDict[pcdpair] = (self.Profile.FileName,self.CurrentLineNumber)\r
1621\r
30fdf114
LG
1622 ## __GetTokenStatements() method\r
1623 #\r
1624 # Get token statements\r
1625 #\r
1626 # @param self The object pointer\r
1627 # @param Obj for whom token statement is got\r
30fdf114
LG
1628 #\r
1629 def __GetTokenStatements(self, Obj):\r
e8a47801
LG
1630 if self.__IsKeyword( "BaseAddress"):\r
1631 if not self.__IsToken( "="):\r
1632 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
f7496d71 1633\r
e8a47801
LG
1634 if not self.__GetNextHexNumber():\r
1635 raise Warning("expected Hex base address", self.FileName, self.CurrentLineNumber)\r
f7496d71 1636\r
e8a47801 1637 Obj.BaseAddress = self.__Token\r
f7496d71 1638\r
e8a47801 1639 if self.__IsToken( "|"):\r
543f5ac3 1640 pcdPair = self.__GetNextPcdSettings()\r
e8a47801
LG
1641 Obj.BaseAddressPcd = pcdPair\r
1642 self.Profile.PcdDict[pcdPair] = Obj.BaseAddress\r
543f5ac3 1643 self.SetPcdLocalation(pcdPair)\r
e8a47801
LG
1644 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1645 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
1646 return True\r
30fdf114 1647\r
e8a47801
LG
1648 if self.__IsKeyword( "Size"):\r
1649 if not self.__IsToken( "="):\r
1650 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
f7496d71 1651\r
e8a47801
LG
1652 if not self.__GetNextHexNumber():\r
1653 raise Warning("expected Hex size", self.FileName, self.CurrentLineNumber)\r
30fdf114 1654\r
e8a47801
LG
1655 Size = self.__Token\r
1656 if self.__IsToken( "|"):\r
543f5ac3 1657 pcdPair = self.__GetNextPcdSettings()\r
e8a47801
LG
1658 Obj.SizePcd = pcdPair\r
1659 self.Profile.PcdDict[pcdPair] = Size\r
543f5ac3 1660 self.SetPcdLocalation(pcdPair)\r
e8a47801
LG
1661 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1662 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
1663 Obj.Size = long(Size, 0)\r
1664 return True\r
30fdf114 1665\r
e8a47801
LG
1666 if self.__IsKeyword( "ErasePolarity"):\r
1667 if not self.__IsToken( "="):\r
1668 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
f7496d71 1669\r
e8a47801
LG
1670 if not self.__GetNextToken():\r
1671 raise Warning("expected Erase Polarity", self.FileName, self.CurrentLineNumber)\r
f7496d71 1672\r
e8a47801
LG
1673 if self.__Token != "1" and self.__Token != "0":\r
1674 raise Warning("expected 1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber)\r
f7496d71 1675\r
e8a47801
LG
1676 Obj.ErasePolarity = self.__Token\r
1677 return True\r
30fdf114 1678\r
e8a47801 1679 return self.__GetBlockStatements(Obj)\r
30fdf114
LG
1680\r
1681 ## __GetAddressStatements() method\r
1682 #\r
1683 # Get address statements\r
1684 #\r
1685 # @param self The object pointer\r
1686 # @param Obj for whom address statement is got\r
1687 # @retval True Successfully find\r
1688 # @retval False Not able to find\r
1689 #\r
1690 def __GetAddressStatements(self, Obj):\r
1691\r
1692 if self.__IsKeyword("BsBaseAddress"):\r
1693 if not self.__IsToken( "="):\r
1694 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1695\r
1696 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1697 raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
1698\r
1699 BsAddress = long(self.__Token, 0)\r
1700 Obj.BsBaseAddress = BsAddress\r
1701\r
1702 if self.__IsKeyword("RtBaseAddress"):\r
1703 if not self.__IsToken( "="):\r
1704 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1705\r
1706 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1707 raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
1708\r
1709 RtAddress = long(self.__Token, 0)\r
1710 Obj.RtBaseAddress = RtAddress\r
1711\r
1712 ## __GetBlockStatements() method\r
1713 #\r
1714 # Get block statements\r
1715 #\r
1716 # @param self The object pointer\r
1717 # @param Obj for whom block statement is got\r
30fdf114
LG
1718 #\r
1719 def __GetBlockStatements(self, Obj):\r
e8a47801 1720 IsBlock = False\r
30fdf114 1721 while self.__GetBlockStatement(Obj):\r
e8a47801 1722 IsBlock = True\r
f7496d71 1723\r
e8a47801 1724 Item = Obj.BlockSizeList[-1]\r
4231a819 1725 if Item[0] is None or Item[1] is None:\r
6780eef1 1726 raise Warning("expected block statement", self.FileName, self.CurrentLineNumber)\r
e8a47801 1727 return IsBlock\r
30fdf114
LG
1728\r
1729 ## __GetBlockStatement() method\r
1730 #\r
1731 # Get block statement\r
1732 #\r
1733 # @param self The object pointer\r
1734 # @param Obj for whom block statement is got\r
1735 # @retval True Successfully find\r
1736 # @retval False Not able to find\r
1737 #\r
1738 def __GetBlockStatement(self, Obj):\r
1739 if not self.__IsKeyword( "BlockSize"):\r
1740 return False\r
1741\r
1742 if not self.__IsToken( "="):\r
1743 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1744\r
1745 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
6780eef1 1746 raise Warning("expected Hex or Integer block size", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1747\r
1748 BlockSize = self.__Token\r
1749 BlockSizePcd = None\r
1750 if self.__IsToken( "|"):\r
543f5ac3 1751 PcdPair = self.__GetNextPcdSettings()\r
30fdf114
LG
1752 BlockSizePcd = PcdPair\r
1753 self.Profile.PcdDict[PcdPair] = BlockSize\r
543f5ac3 1754 self.SetPcdLocalation(PcdPair)\r
d0acc87a
LG
1755 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1756 self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
52302d4d 1757 BlockSize = long(BlockSize, 0)\r
30fdf114
LG
1758\r
1759 BlockNumber = None\r
1760 if self.__IsKeyword( "NumBlocks"):\r
1761 if not self.__IsToken( "="):\r
1762 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1763\r
1764 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1765 raise Warning("expected block numbers", self.FileName, self.CurrentLineNumber)\r
1766\r
1767 BlockNumber = long(self.__Token, 0)\r
1768\r
1769 Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))\r
1770 return True\r
1771\r
1772 ## __GetDefineStatements() method\r
1773 #\r
1774 # Get define statements\r
1775 #\r
1776 # @param self The object pointer\r
1777 # @param Obj for whom define statement is got\r
1778 # @retval True Successfully find\r
1779 # @retval False Not able to find\r
1780 #\r
1781 def __GetDefineStatements(self, Obj):\r
1782 while self.__GetDefineStatement( Obj):\r
1783 pass\r
1784\r
1785 ## __GetDefineStatement() method\r
1786 #\r
1787 # Get define statement\r
1788 #\r
1789 # @param self The object pointer\r
1790 # @param Obj for whom define statement is got\r
1791 # @retval True Successfully find\r
1792 # @retval False Not able to find\r
1793 #\r
1794 def __GetDefineStatement(self, Obj):\r
1795 if self.__IsKeyword("DEFINE"):\r
1796 self.__GetNextToken()\r
1797 Macro = self.__Token\r
1798 if not self.__IsToken( "="):\r
1799 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1800\r
1801 if not self.__GetNextToken():\r
1802 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
1803\r
1804 Value = self.__Token\r
1805 Macro = '$(' + Macro + ')'\r
1806 Obj.DefineVarDict[Macro] = Value\r
1807 return True\r
1808\r
1809 return False\r
1810\r
1811 ## __GetSetStatements() method\r
1812 #\r
1813 # Get set statements\r
1814 #\r
1815 # @param self The object pointer\r
1816 # @param Obj for whom set statement is got\r
1817 # @retval True Successfully find\r
1818 # @retval False Not able to find\r
1819 #\r
1820 def __GetSetStatements(self, Obj):\r
1821 while self.__GetSetStatement(Obj):\r
1822 pass\r
1823\r
1824 ## __GetSetStatement() method\r
1825 #\r
1826 # Get set statement\r
1827 #\r
1828 # @param self The object pointer\r
1829 # @param Obj for whom set statement is got\r
1830 # @retval True Successfully find\r
1831 # @retval False Not able to find\r
1832 #\r
1833 def __GetSetStatement(self, Obj):\r
1834 if self.__IsKeyword("SET"):\r
543f5ac3 1835 PcdPair = self.__GetNextPcdSettings()\r
30fdf114
LG
1836\r
1837 if not self.__IsToken( "="):\r
1838 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1839\r
d0acc87a
LG
1840 Value = self.__GetExpression()\r
1841 Value = self.__EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True)\r
30fdf114 1842\r
6780eef1
LG
1843 if Obj:\r
1844 Obj.SetVarDict[PcdPair] = Value\r
30fdf114 1845 self.Profile.PcdDict[PcdPair] = Value\r
543f5ac3 1846 self.SetPcdLocalation(PcdPair)\r
d0acc87a
LG
1847 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1848 self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
30fdf114
LG
1849 return True\r
1850\r
1851 return False\r
1852\r
4afd3d04
LG
1853 ## __CalcRegionExpr(self)\r
1854 #\r
1855 # Calculate expression for offset or size of a region\r
1856 #\r
1857 # @return: None if invalid expression\r
1858 # Calculated number if successfully\r
1859 #\r
1860 def __CalcRegionExpr(self):\r
1861 StartPos = self.GetFileBufferPos()\r
1862 Expr = ''\r
1863 PairCount = 0\r
1864 while not self.__EndOfFile():\r
1865 CurCh = self.__CurrentChar()\r
1866 if CurCh == '(':\r
1867 PairCount += 1\r
1868 elif CurCh == ')':\r
1869 PairCount -= 1\r
1870\r
1871 if CurCh in '|\r\n' and PairCount == 0:\r
1872 break\r
1873 Expr += CurCh\r
1874 self.__GetOneChar()\r
1875 try:\r
1876 return long(\r
1877 ValueExpression(Expr,\r
2bc3256c 1878 self.__CollectMacroPcd()\r
ccaa7754 1879 )(True), 0)\r
4afd3d04
LG
1880 except Exception:\r
1881 self.SetFileBufferPos(StartPos)\r
1882 return None\r
1883\r
30fdf114
LG
1884 ## __GetRegionLayout() method\r
1885 #\r
1886 # Get region layout for FD\r
1887 #\r
1888 # @param self The object pointer\r
1889 # @param Fd for whom region is got\r
1890 # @retval True Successfully find\r
1891 # @retval False Not able to find\r
1892 #\r
1893 def __GetRegionLayout(self, Fd):\r
f7496d71 1894 Offset = self.__CalcRegionExpr()\r
4231a819 1895 if Offset is None:\r
30fdf114
LG
1896 return False\r
1897\r
1898 RegionObj = Region.Region()\r
4afd3d04 1899 RegionObj.Offset = Offset\r
30fdf114
LG
1900 Fd.RegionList.append(RegionObj)\r
1901\r
1902 if not self.__IsToken( "|"):\r
1903 raise Warning("expected '|'", self.FileName, self.CurrentLineNumber)\r
1904\r
4afd3d04 1905 Size = self.__CalcRegionExpr()\r
4231a819 1906 if Size is None:\r
30fdf114 1907 raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber)\r
4afd3d04 1908 RegionObj.Size = Size\r
30fdf114
LG
1909\r
1910 if not self.__GetNextWord():\r
1911 return True\r
1912\r
91fa33ee 1913 if not self.__Token in ("SET", BINARY_FILE_TYPE_FV, "FILE", "DATA", "CAPSULE", "INF"):\r
2bc3256c
LG
1914 #\r
1915 # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]\r
1916 # Or it might be next region's offset described by an expression which starts with a PCD.\r
1917 # PcdOffset[|PcdSize] or OffsetPcdExpression|Size\r
1918 #\r
30fdf114 1919 self.__UndoToken()\r
2bc3256c
LG
1920 IsRegionPcd = (RegionSizeGuidPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]) or\r
1921 RegionOffsetPcdPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]))\r
1922 if IsRegionPcd:\r
543f5ac3 1923 RegionObj.PcdOffset = self.__GetNextPcdSettings()\r
2bc3256c 1924 self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + long(Fd.BaseAddress, 0))\r
543f5ac3 1925 self.SetPcdLocalation(RegionObj.PcdOffset)\r
2bc3256c 1926 self.__PcdDict['%s.%s' % (RegionObj.PcdOffset[1], RegionObj.PcdOffset[0])] = "0x%x" % RegionObj.Offset\r
d0acc87a 1927 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2bc3256c
LG
1928 self.Profile.PcdFileLineDict[RegionObj.PcdOffset] = FileLineTuple\r
1929 if self.__IsToken( "|"):\r
543f5ac3 1930 RegionObj.PcdSize = self.__GetNextPcdSettings()\r
2bc3256c 1931 self.Profile.PcdDict[RegionObj.PcdSize] = "0x%08X" % RegionObj.Size\r
543f5ac3 1932 self.SetPcdLocalation(RegionObj.PcdSize)\r
2bc3256c
LG
1933 self.__PcdDict['%s.%s' % (RegionObj.PcdSize[1], RegionObj.PcdSize[0])] = "0x%x" % RegionObj.Size\r
1934 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1935 self.Profile.PcdFileLineDict[RegionObj.PcdSize] = FileLineTuple\r
30fdf114
LG
1936\r
1937 if not self.__GetNextWord():\r
1938 return True\r
1939\r
1940 if self.__Token == "SET":\r
1941 self.__UndoToken()\r
1942 self.__GetSetStatements( RegionObj)\r
1943 if not self.__GetNextWord():\r
1944 return True\r
1945\r
91fa33ee 1946 elif self.__Token == BINARY_FILE_TYPE_FV:\r
30fdf114
LG
1947 self.__UndoToken()\r
1948 self.__GetRegionFvType( RegionObj)\r
1949\r
fd171542 1950 elif self.__Token == "CAPSULE":\r
1951 self.__UndoToken()\r
1952 self.__GetRegionCapType( RegionObj)\r
1953\r
30fdf114
LG
1954 elif self.__Token == "FILE":\r
1955 self.__UndoToken()\r
b21a13fb
YZ
1956 self.__GetRegionFileType(RegionObj)\r
1957\r
1958 elif self.__Token == "INF":\r
1959 self.__UndoToken()\r
1960 RegionObj.RegionType = "INF"\r
1961 while self.__IsKeyword("INF"):\r
1962 self.__UndoToken()\r
1963 ffsInf = self.__ParseInfStatement()\r
1964 if not ffsInf:\r
1965 break\r
1966 RegionObj.RegionDataList.append(ffsInf)\r
30fdf114 1967\r
79b74a03 1968 elif self.__Token == "DATA":\r
30fdf114 1969 self.__UndoToken()\r
b21a13fb 1970 self.__GetRegionDataType(RegionObj)\r
79b74a03 1971 else:\r
2bc3256c
LG
1972 self.__UndoToken()\r
1973 if self.__GetRegionLayout(Fd):\r
1974 return True\r
79b74a03 1975 raise Warning("A valid region type was not found. "\r
b21a13fb 1976 "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred",\r
79b74a03 1977 self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1978\r
1979 return True\r
1980\r
1981 ## __GetRegionFvType() method\r
1982 #\r
1983 # Get region fv data for region\r
1984 #\r
1985 # @param self The object pointer\r
1986 # @param RegionObj for whom region data is got\r
1987 #\r
1988 def __GetRegionFvType(self, RegionObj):\r
1989\r
91fa33ee
CJ
1990 if not self.__IsKeyword( BINARY_FILE_TYPE_FV):\r
1991 raise Warning("expected Keyword BINARY_FILE_TYPE_FV", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1992\r
1993 if not self.__IsToken( "="):\r
1994 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1995\r
1996 if not self.__GetNextToken():\r
1997 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
1998\r
91fa33ee 1999 RegionObj.RegionType = BINARY_FILE_TYPE_FV\r
0199377c 2000 RegionObj.RegionDataList.append((self.__Token).upper())\r
30fdf114 2001\r
91fa33ee 2002 while self.__IsKeyword( BINARY_FILE_TYPE_FV):\r
30fdf114
LG
2003\r
2004 if not self.__IsToken( "="):\r
2005 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2006\r
2007 if not self.__GetNextToken():\r
2008 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2009\r
0199377c 2010 RegionObj.RegionDataList.append((self.__Token).upper())\r
30fdf114 2011\r
fd171542 2012 ## __GetRegionCapType() method\r
2013 #\r
2014 # Get region capsule data for region\r
2015 #\r
2016 # @param self The object pointer\r
2017 # @param RegionObj for whom region data is got\r
2018 #\r
2019 def __GetRegionCapType(self, RegionObj):\r
2020\r
2021 if not self.__IsKeyword("CAPSULE"):\r
2022 raise Warning("expected Keyword 'CAPSULE'", self.FileName, self.CurrentLineNumber)\r
2023\r
2024 if not self.__IsToken("="):\r
2025 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2026\r
2027 if not self.__GetNextToken():\r
2028 raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
2029\r
2030 RegionObj.RegionType = "CAPSULE"\r
2031 RegionObj.RegionDataList.append(self.__Token)\r
2032\r
2033 while self.__IsKeyword("CAPSULE"):\r
2034\r
2035 if not self.__IsToken("="):\r
2036 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2037\r
2038 if not self.__GetNextToken():\r
2039 raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
2040\r
2041 RegionObj.RegionDataList.append(self.__Token)\r
2042\r
30fdf114
LG
2043 ## __GetRegionFileType() method\r
2044 #\r
2045 # Get region file data for region\r
2046 #\r
2047 # @param self The object pointer\r
2048 # @param RegionObj for whom region data is got\r
2049 #\r
2050 def __GetRegionFileType(self, RegionObj):\r
2051\r
2052 if not self.__IsKeyword( "FILE"):\r
2053 raise Warning("expected Keyword 'FILE'", self.FileName, self.CurrentLineNumber)\r
2054\r
2055 if not self.__IsToken( "="):\r
2056 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2057\r
2058 if not self.__GetNextToken():\r
2059 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
2060\r
2061 RegionObj.RegionType = "FILE"\r
2062 RegionObj.RegionDataList.append( self.__Token)\r
2063\r
2064 while self.__IsKeyword( "FILE"):\r
2065\r
2066 if not self.__IsToken( "="):\r
2067 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2068\r
2069 if not self.__GetNextToken():\r
2070 raise Warning("expected FILE name", self.FileName, self.CurrentLineNumber)\r
2071\r
2072 RegionObj.RegionDataList.append(self.__Token)\r
2073\r
2074 ## __GetRegionDataType() method\r
2075 #\r
2076 # Get region array data for region\r
2077 #\r
2078 # @param self The object pointer\r
2079 # @param RegionObj for whom region data is got\r
2080 #\r
2081 def __GetRegionDataType(self, RegionObj):\r
2082\r
2083 if not self.__IsKeyword( "DATA"):\r
2084 raise Warning("expected Region Data type", self.FileName, self.CurrentLineNumber)\r
2085\r
2086 if not self.__IsToken( "="):\r
2087 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2088\r
2089 if not self.__IsToken( "{"):\r
2090 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2091\r
2092 if not self.__GetNextHexNumber():\r
2093 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2094\r
636f2be6
LG
2095 if len(self.__Token) > 18:\r
2096 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
2097\r
2098 # convert hex string value to byte hex string array\r
2099 AllString = self.__Token\r
2100 AllStrLen = len (AllString)\r
2101 DataString = ""\r
2102 while AllStrLen > 4:\r
2103 DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
2104 AllStrLen = AllStrLen - 2\r
2105 DataString = DataString + AllString[:AllStrLen] + ","\r
2106\r
2107 # byte value array\r
2108 if len (self.__Token) <= 4:\r
2109 while self.__IsToken(","):\r
2110 if not self.__GetNextHexNumber():\r
2111 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2112 if len(self.__Token) > 4:\r
2113 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2114 DataString += self.__Token\r
2115 DataString += ","\r
30fdf114
LG
2116\r
2117 if not self.__IsToken( "}"):\r
2118 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2119\r
2120 DataString = DataString.rstrip(",")\r
2121 RegionObj.RegionType = "DATA"\r
2122 RegionObj.RegionDataList.append( DataString)\r
2123\r
2124 while self.__IsKeyword( "DATA"):\r
2125\r
2126 if not self.__IsToken( "="):\r
2127 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2128\r
2129 if not self.__IsToken( "{"):\r
2130 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2131\r
2132 if not self.__GetNextHexNumber():\r
2133 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2134\r
636f2be6
LG
2135 if len(self.__Token) > 18:\r
2136 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
2137\r
2138 # convert hex string value to byte hex string array\r
2139 AllString = self.__Token\r
2140 AllStrLen = len (AllString)\r
2141 DataString = ""\r
2142 while AllStrLen > 4:\r
2143 DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
2144 AllStrLen = AllStrLen - 2\r
2145 DataString = DataString + AllString[:AllStrLen] + ","\r
2146\r
2147 # byte value array\r
2148 if len (self.__Token) <= 4:\r
2149 while self.__IsToken(","):\r
2150 if not self.__GetNextHexNumber():\r
2151 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2152 if len(self.__Token) > 4:\r
2153 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2154 DataString += self.__Token\r
2155 DataString += ","\r
30fdf114
LG
2156\r
2157 if not self.__IsToken( "}"):\r
2158 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2159\r
2160 DataString = DataString.rstrip(",")\r
2161 RegionObj.RegionDataList.append( DataString)\r
2162\r
2163 ## __GetFv() method\r
2164 #\r
2165 # Get FV section contents and store its data into FV dictionary of self.Profile\r
2166 #\r
2167 # @param self The object pointer\r
2168 # @retval True Successfully find a FV\r
2169 # @retval False Not able to find a FV\r
2170 #\r
2171 def __GetFv(self):\r
2172 if not self.__GetNextToken():\r
2173 return False\r
2174\r
2175 S = self.__Token.upper()\r
2176 if S.startswith("[") and not S.startswith("[FV."):\r
df81077f 2177 self.SectionParser(S)\r
30fdf114
LG
2178 self.__UndoToken()\r
2179 return False\r
2180\r
2181 self.__UndoToken()\r
2182 if not self.__IsToken("[FV.", True):\r
2183 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2184 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2185 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2186 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2187\r
2188 FvName = self.__GetUiName()\r
2189 self.CurrentFvName = FvName.upper()\r
2190\r
2191 if not self.__IsToken( "]"):\r
2192 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2193\r
2194 FvObj = Fv.FV()\r
2195 FvObj.UiFvName = self.CurrentFvName\r
2196 self.Profile.FvDict[self.CurrentFvName] = FvObj\r
2197\r
2198 Status = self.__GetCreateFile(FvObj)\r
2199 if not Status:\r
2200 raise Warning("FV name error", self.FileName, self.CurrentLineNumber)\r
2201\r
2202 self.__GetDefineStatements(FvObj)\r
2203\r
2204 self.__GetAddressStatements(FvObj)\r
2205\r
b303ea72
LG
2206 FvObj.FvExtEntryTypeValue = []\r
2207 FvObj.FvExtEntryType = []\r
2208 FvObj.FvExtEntryData = []\r
2209 while True:\r
e8a47801
LG
2210 self.__GetSetStatements(FvObj)\r
2211\r
f7496d71
LG
2212 if not (self.__GetBlockStatement(FvObj) or self.__GetFvBaseAddress(FvObj) or\r
2213 self.__GetFvForceRebase(FvObj) or self.__GetFvAlignment(FvObj) or\r
2214 self.__GetFvAttributes(FvObj) or self.__GetFvNameGuid(FvObj) or\r
aaf8aa7b 2215 self.__GetFvExtEntryStatement(FvObj) or self.__GetFvNameString(FvObj)):\r
b303ea72
LG
2216 break\r
2217\r
aaf8aa7b
YL
2218 if FvObj.FvNameString == 'TRUE' and not FvObj.FvNameGuid:\r
2219 raise Warning("FvNameString found but FvNameGuid was not found", self.FileName, self.CurrentLineNumber)\r
2220\r
30fdf114
LG
2221 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
2222 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
2223\r
2224 while True:\r
cdc9b0c2 2225 isInf = self.__GetInfStatement(FvObj)\r
30fdf114
LG
2226 isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
2227 if not isInf and not isFile:\r
2228 break\r
2229\r
2230 return True\r
2231\r
2232 ## __GetFvAlignment() method\r
2233 #\r
2234 # Get alignment for FV\r
2235 #\r
2236 # @param self The object pointer\r
2237 # @param Obj for whom alignment is got\r
2238 # @retval True Successfully find a alignment statement\r
2239 # @retval False Not able to find a alignment statement\r
2240 #\r
2241 def __GetFvAlignment(self, Obj):\r
2242\r
2243 if not self.__IsKeyword( "FvAlignment"):\r
2244 return False\r
2245\r
2246 if not self.__IsToken( "="):\r
2247 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2248\r
2249 if not self.__GetNextToken():\r
2250 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2251\r
2252 if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \\r
2253 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \\r
2254 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \\r
2255 "1G", "2G"):\r
2256 raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2257 Obj.FvAlignment = self.__Token\r
2258 return True\r
f7496d71 2259\r
4234283c
LG
2260 ## __GetFvBaseAddress() method\r
2261 #\r
2262 # Get BaseAddress for FV\r
2263 #\r
2264 # @param self The object pointer\r
2265 # @param Obj for whom FvBaseAddress is got\r
2266 # @retval True Successfully find a FvBaseAddress statement\r
2267 # @retval False Not able to find a FvBaseAddress statement\r
2268 #\r
2269 def __GetFvBaseAddress(self, Obj):\r
2270\r
2271 if not self.__IsKeyword("FvBaseAddress"):\r
2272 return False\r
2273\r
2274 if not self.__IsToken( "="):\r
2275 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2276\r
2277 if not self.__GetNextToken():\r
2278 raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber)\r
2279\r
ffe720c5 2280 if not BaseAddrValuePattern.match(self.__Token.upper()):\r
79b74a03 2281 raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4234283c 2282 Obj.FvBaseAddress = self.__Token\r
f7496d71
LG
2283 return True\r
2284\r
79b74a03
LG
2285 ## __GetFvForceRebase() method\r
2286 #\r
2287 # Get FvForceRebase for FV\r
2288 #\r
2289 # @param self The object pointer\r
2290 # @param Obj for whom FvForceRebase is got\r
2291 # @retval True Successfully find a FvForceRebase statement\r
2292 # @retval False Not able to find a FvForceRebase statement\r
2293 #\r
2294 def __GetFvForceRebase(self, Obj):\r
2295\r
2296 if not self.__IsKeyword("FvForceRebase"):\r
2297 return False\r
2298\r
2299 if not self.__IsToken( "="):\r
2300 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2301\r
2302 if not self.__GetNextToken():\r
2303 raise Warning("expected FvForceRebase value", self.FileName, self.CurrentLineNumber)\r
30fdf114 2304\r
79b74a03
LG
2305 if self.__Token.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:\r
2306 raise Warning("Unknown FvForceRebase value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
f7496d71 2307\r
79b74a03
LG
2308 if self.__Token.upper() in ["TRUE", "1", "0X1", "0X01"]:\r
2309 Obj.FvForceRebase = True\r
2310 elif self.__Token.upper() in ["FALSE", "0", "0X0", "0X00"]:\r
2311 Obj.FvForceRebase = False\r
2312 else:\r
2313 Obj.FvForceRebase = None\r
f7496d71 2314\r
79b74a03 2315 return True\r
0d2711a6
LG
2316\r
2317\r
30fdf114
LG
2318 ## __GetFvAttributes() method\r
2319 #\r
2320 # Get attributes for FV\r
2321 #\r
2322 # @param self The object pointer\r
2323 # @param Obj for whom attribute is got\r
2324 # @retval None\r
2325 #\r
2326 def __GetFvAttributes(self, FvObj):\r
2bc3256c 2327 IsWordToken = False\r
30fdf114 2328 while self.__GetNextWord():\r
2bc3256c 2329 IsWordToken = True\r
30fdf114
LG
2330 name = self.__Token\r
2331 if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \\r
2332 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \\r
2333 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \\r
2334 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \\r
2335 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \\r
9425b349 2336 "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", "FvUsedSizeEnable"):\r
30fdf114 2337 self.__UndoToken()\r
e8a47801 2338 return False\r
30fdf114
LG
2339\r
2340 if not self.__IsToken( "="):\r
2341 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2342\r
2343 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2344 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2345\r
2346 FvObj.FvAttributeDict[name] = self.__Token\r
2347\r
2bc3256c 2348 return IsWordToken\r
f7496d71 2349\r
30fdf114
LG
2350 ## __GetFvNameGuid() method\r
2351 #\r
2352 # Get FV GUID for FV\r
2353 #\r
2354 # @param self The object pointer\r
2355 # @param Obj for whom GUID is got\r
2356 # @retval None\r
2357 #\r
2358 def __GetFvNameGuid(self, FvObj):\r
2359\r
2360 if not self.__IsKeyword( "FvNameGuid"):\r
e8a47801 2361 return False\r
30fdf114
LG
2362\r
2363 if not self.__IsToken( "="):\r
2364 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2365\r
2366 if not self.__GetNextGuid():\r
2367 raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)\r
2368\r
2369 FvObj.FvNameGuid = self.__Token\r
2370\r
e8a47801 2371 return True\r
30fdf114 2372\r
aaf8aa7b
YL
2373 def __GetFvNameString(self, FvObj):\r
2374\r
2375 if not self.__IsKeyword( "FvNameString"):\r
2376 return False\r
2377\r
2378 if not self.__IsToken( "="):\r
2379 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2380\r
2381 if not self.__GetNextToken() or self.__Token not in ('TRUE', 'FALSE'):\r
2382 raise Warning("expected TRUE or FALSE for FvNameString", self.FileName, self.CurrentLineNumber)\r
2383\r
2384 FvObj.FvNameString = self.__Token\r
2385\r
2386 return True\r
2387\r
b303ea72
LG
2388 def __GetFvExtEntryStatement(self, FvObj):\r
2389\r
92d07e48 2390 if not (self.__IsKeyword( "FV_EXT_ENTRY") or self.__IsKeyword( "FV_EXT_ENTRY_TYPE")):\r
b303ea72
LG
2391 return False\r
2392\r
2393 if not self.__IsKeyword ("TYPE"):\r
2394 raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber)\r
f7496d71 2395\r
b303ea72
LG
2396 if not self.__IsToken( "="):\r
2397 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2398\r
2399 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
2400 raise Warning("expected Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber)\r
2401\r
caf74495 2402 FvObj.FvExtEntryTypeValue.append(self.__Token)\r
b303ea72
LG
2403\r
2404 if not self.__IsToken( "{"):\r
2405 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2406\r
2407 if not self.__IsKeyword ("FILE") and not self.__IsKeyword ("DATA"):\r
2408 raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\r
2409\r
caf74495 2410 FvObj.FvExtEntryType.append(self.__Token)\r
b303ea72
LG
2411\r
2412 if self.__Token == 'DATA':\r
2413\r
2414 if not self.__IsToken( "="):\r
2415 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
f7496d71 2416\r
b303ea72
LG
2417 if not self.__IsToken( "{"):\r
2418 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2419\r
2420 if not self.__GetNextHexNumber():\r
2421 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2422\r
2423 if len(self.__Token) > 4:\r
2424 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2425\r
2426 DataString = self.__Token\r
2427 DataString += ","\r
2428\r
2429 while self.__IsToken(","):\r
2430 if not self.__GetNextHexNumber():\r
2431 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2432 if len(self.__Token) > 4:\r
2433 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2434 DataString += self.__Token\r
2435 DataString += ","\r
2436\r
2437 if not self.__IsToken( "}"):\r
2438 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2439\r
2440 if not self.__IsToken( "}"):\r
2441 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2442\r
2443 DataString = DataString.rstrip(",")\r
caf74495 2444 FvObj.FvExtEntryData.append(DataString)\r
b303ea72
LG
2445\r
2446 if self.__Token == 'FILE':\r
f7496d71 2447\r
b303ea72
LG
2448 if not self.__IsToken( "="):\r
2449 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
f7496d71 2450\r
b303ea72
LG
2451 if not self.__GetNextToken():\r
2452 raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
f7496d71 2453\r
caf74495 2454 FvObj.FvExtEntryData.append(self.__Token)\r
b303ea72
LG
2455\r
2456 if not self.__IsToken( "}"):\r
2457 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2458\r
2459 return True\r
2460\r
30fdf114
LG
2461 ## __GetAprioriSection() method\r
2462 #\r
2463 # Get token statements\r
2464 #\r
2465 # @param self The object pointer\r
2466 # @param FvObj for whom apriori is got\r
2467 # @param MacroDict dictionary used to replace macro\r
2468 # @retval True Successfully find apriori statement\r
2469 # @retval False Not able to find apriori statement\r
2470 #\r
2471 def __GetAprioriSection(self, FvObj, MacroDict = {}):\r
2472\r
2473 if not self.__IsKeyword( "APRIORI"):\r
2474 return False\r
2475\r
2476 if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"):\r
2477 raise Warning("expected Apriori file type", self.FileName, self.CurrentLineNumber)\r
2478 AprType = self.__Token\r
2479\r
2480 if not self.__IsToken( "{"):\r
2481 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2482\r
2483 AprSectionObj = AprioriSection.AprioriSection()\r
2484 AprSectionObj.AprioriType = AprType\r
2485\r
2486 self.__GetDefineStatements(AprSectionObj)\r
2487 MacroDict.update(AprSectionObj.DefineVarDict)\r
2488\r
2489 while True:\r
cdc9b0c2 2490 IsInf = self.__GetInfStatement(AprSectionObj)\r
30fdf114
LG
2491 IsFile = self.__GetFileStatement( AprSectionObj)\r
2492 if not IsInf and not IsFile:\r
2493 break\r
2494\r
2495 if not self.__IsToken( "}"):\r
2496 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2497\r
2498 FvObj.AprioriSectionList.append(AprSectionObj)\r
2499 return True\r
2500\r
b21a13fb
YZ
2501 def __ParseInfStatement(self):\r
2502 if not self.__IsKeyword("INF"):\r
2503 return None\r
30fdf114
LG
2504\r
2505 ffsInf = FfsInfStatement.FfsInfStatement()\r
b21a13fb 2506 self.__GetInfOptions(ffsInf)\r
30fdf114
LG
2507\r
2508 if not self.__GetNextToken():\r
2509 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
2510 ffsInf.InfFileName = self.__Token\r
a87e79d9
YZ
2511 if not ffsInf.InfFileName.endswith('.inf'):\r
2512 raise Warning("expected .inf file path", self.FileName, self.CurrentLineNumber)\r
64b2609f
LG
2513\r
2514 ffsInf.CurrentLineNum = self.CurrentLineNumber\r
2515 ffsInf.CurrentLineContent = self.__CurrentLine()\r
2516\r
97fa0ee9
YL
2517 #Replace $(SAPCE) with real space\r
2518 ffsInf.InfFileName = ffsInf.InfFileName.replace('$(SPACE)', ' ')\r
2519\r
14c48571 2520 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
2521 #do case sensitive check for file path\r
2522 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2523 if ErrorCode != 0:\r
2524 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114 2525\r
30fdf114
LG
2526 if not ffsInf.InfFileName in self.Profile.InfList:\r
2527 self.Profile.InfList.append(ffsInf.InfFileName)\r
d0acc87a
LG
2528 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2529 self.Profile.InfFileLineList.append(FileLineTuple)\r
2502b735
YZ
2530 if ffsInf.UseArch:\r
2531 if ffsInf.UseArch not in self.Profile.InfDict:\r
2532 self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName]\r
2533 else:\r
2534 self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName)\r
2535 else:\r
2536 self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
30fdf114
LG
2537\r
2538 if self.__IsToken('|'):\r
2539 if self.__IsKeyword('RELOCS_STRIPPED'):\r
2540 ffsInf.KeepReloc = False\r
2541 elif self.__IsKeyword('RELOCS_RETAINED'):\r
2542 ffsInf.KeepReloc = True\r
2543 else:\r
2544 raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
b21a13fb
YZ
2545 return ffsInf\r
2546\r
2547 ## __GetInfStatement() method\r
2548 #\r
2549 # Get INF statements\r
2550 #\r
2551 # @param self The object pointer\r
2552 # @param Obj for whom inf statement is got\r
b21a13fb
YZ
2553 # @retval True Successfully find inf statement\r
2554 # @retval False Not able to find inf statement\r
2555 #\r
cdc9b0c2 2556 def __GetInfStatement(self, Obj, ForCapsule=False):\r
b21a13fb
YZ
2557 ffsInf = self.__ParseInfStatement()\r
2558 if not ffsInf:\r
2559 return False\r
2560\r
30fdf114
LG
2561 if ForCapsule:\r
2562 capsuleFfs = CapsuleData.CapsuleFfs()\r
2563 capsuleFfs.Ffs = ffsInf\r
2564 Obj.CapsuleDataList.append(capsuleFfs)\r
2565 else:\r
2566 Obj.FfsList.append(ffsInf)\r
2567 return True\r
2568\r
2569 ## __GetInfOptions() method\r
2570 #\r
2571 # Get options for INF\r
2572 #\r
2573 # @param self The object pointer\r
2574 # @param FfsInfObj for whom option is got\r
2575 #\r
2576 def __GetInfOptions(self, FfsInfObj):\r
97fa0ee9
YL
2577 if self.__IsKeyword("FILE_GUID"):\r
2578 if not self.__IsToken("="):\r
2579 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2580 if not self.__GetNextGuid():\r
2581 raise Warning("expected GUID value", self.FileName, self.CurrentLineNumber)\r
2582 FfsInfObj.OverrideGuid = self.__Token\r
30fdf114
LG
2583\r
2584 if self.__IsKeyword( "RuleOverride"):\r
2585 if not self.__IsToken( "="):\r
2586 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2587 if not self.__GetNextToken():\r
2588 raise Warning("expected Rule name", self.FileName, self.CurrentLineNumber)\r
2589 FfsInfObj.Rule = self.__Token\r
2590\r
2591 if self.__IsKeyword( "VERSION"):\r
2592 if not self.__IsToken( "="):\r
2593 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2594 if not self.__GetNextToken():\r
2595 raise Warning("expected Version", self.FileName, self.CurrentLineNumber)\r
2596\r
2597 if self.__GetStringData():\r
2598 FfsInfObj.Version = self.__Token\r
2599\r
91fa33ee 2600 if self.__IsKeyword( BINARY_FILE_TYPE_UI):\r
30fdf114
LG
2601 if not self.__IsToken( "="):\r
2602 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2603 if not self.__GetNextToken():\r
2604 raise Warning("expected UI name", self.FileName, self.CurrentLineNumber)\r
2605\r
2606 if self.__GetStringData():\r
2607 FfsInfObj.Ui = self.__Token\r
2608\r
2609 if self.__IsKeyword( "USE"):\r
2610 if not self.__IsToken( "="):\r
2611 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2612 if not self.__GetNextToken():\r
2613 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
2614 FfsInfObj.UseArch = self.__Token\r
2615\r
f7496d71 2616\r
30fdf114 2617 if self.__GetNextToken():\r
97fa0ee9
YL
2618 p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')\r
2619 if p.match(self.__Token) and p.match(self.__Token).span()[1] == len(self.__Token):\r
30fdf114
LG
2620 FfsInfObj.KeyStringList.append(self.__Token)\r
2621 if not self.__IsToken(","):\r
2622 return\r
2623 else:\r
2624 self.__UndoToken()\r
2625 return\r
2626\r
2627 while self.__GetNextToken():\r
2628 if not p.match(self.__Token):\r
2629 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2630 FfsInfObj.KeyStringList.append(self.__Token)\r
2631\r
2632 if not self.__IsToken(","):\r
2633 break\r
2634\r
2635 ## __GetFileStatement() method\r
2636 #\r
2637 # Get FILE statements\r
2638 #\r
2639 # @param self The object pointer\r
2640 # @param Obj for whom FILE statement is got\r
2641 # @param MacroDict dictionary used to replace macro\r
2642 # @retval True Successfully find FILE statement\r
2643 # @retval False Not able to find FILE statement\r
2644 #\r
2645 def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2646\r
2647 if not self.__IsKeyword( "FILE"):\r
2648 return False\r
2649\r
30fdf114
LG
2650 if not self.__GetNextWord():\r
2651 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
b36d134f
LG
2652\r
2653 if ForCapsule and self.__Token == 'DATA':\r
2654 self.__UndoToken()\r
2655 self.__UndoToken()\r
2656 return False\r
f7496d71 2657\r
b36d134f 2658 FfsFileObj = FfsFileStatement.FileStatement()\r
30fdf114
LG
2659 FfsFileObj.FvFileType = self.__Token\r
2660\r
2661 if not self.__IsToken( "="):\r
2662 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2663\r
2664 if not self.__GetNextGuid():\r
2665 if not self.__GetNextWord():\r
2666 raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)\r
2667 if self.__Token == 'PCD':\r
2668 if not self.__IsToken( "("):\r
2669 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
543f5ac3 2670 PcdPair = self.__GetNextPcdSettings()\r
30fdf114
LG
2671 if not self.__IsToken( ")"):\r
2672 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2673 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
f7496d71 2674\r
30fdf114 2675 FfsFileObj.NameGuid = self.__Token\r
f7496d71 2676\r
30fdf114
LG
2677 self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
2678\r
2679 if ForCapsule:\r
2680 capsuleFfs = CapsuleData.CapsuleFfs()\r
2681 capsuleFfs.Ffs = FfsFileObj\r
2682 Obj.CapsuleDataList.append(capsuleFfs)\r
2683 else:\r
2684 Obj.FfsList.append(FfsFileObj)\r
2685\r
2686 return True\r
2687\r
2688 ## __FileCouldHaveRelocFlag() method\r
2689 #\r
2690 # Check whether reloc strip flag can be set for a file type.\r
2691 #\r
30fdf114
LG
2692 # @param FileType The file type to check with\r
2693 # @retval True This type could have relocation strip flag\r
2694 # @retval False No way to have it\r
2695 #\r
5bcf1d56
CJ
2696 @staticmethod\r
2697 def __FileCouldHaveRelocFlag (FileType):\r
8bb63e37 2698 if FileType in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, 'PEI_DXE_COMBO'):\r
30fdf114
LG
2699 return True\r
2700 else:\r
2701 return False\r
2702\r
2703 ## __SectionCouldHaveRelocFlag() method\r
2704 #\r
2705 # Check whether reloc strip flag can be set for a section type.\r
2706 #\r
30fdf114
LG
2707 # @param SectionType The section type to check with\r
2708 # @retval True This type could have relocation strip flag\r
2709 # @retval False No way to have it\r
2710 #\r
5bcf1d56
CJ
2711 @staticmethod\r
2712 def __SectionCouldHaveRelocFlag (SectionType):\r
91fa33ee 2713 if SectionType in (BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PE32):\r
30fdf114
LG
2714 return True\r
2715 else:\r
2716 return False\r
2717\r
2718 ## __GetFilePart() method\r
2719 #\r
2720 # Get components for FILE statement\r
2721 #\r
2722 # @param self The object pointer\r
2723 # @param FfsFileObj for whom component is got\r
2724 # @param MacroDict dictionary used to replace macro\r
2725 #\r
2726 def __GetFilePart(self, FfsFileObj, MacroDict = {}):\r
2727\r
2728 self.__GetFileOpts( FfsFileObj)\r
2729\r
2730 if not self.__IsToken("{"):\r
4afd3d04
LG
2731 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2732 if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
2733 if self.__Token == 'RELOCS_STRIPPED':\r
2734 FfsFileObj.KeepReloc = False\r
2735 else:\r
2736 FfsFileObj.KeepReloc = True\r
2737 else:\r
2738 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2739\r
2740 if not self.__IsToken("{"):\r
30fdf114
LG
2741 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2742\r
2743 if not self.__GetNextToken():\r
2744 raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
2745\r
91fa33ee 2746 if self.__Token == BINARY_FILE_TYPE_FV:\r
30fdf114
LG
2747 if not self.__IsToken( "="):\r
2748 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2749 if not self.__GetNextToken():\r
2750 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2751 FfsFileObj.FvName = self.__Token\r
2752\r
2753 elif self.__Token == "FD":\r
2754 if not self.__IsToken( "="):\r
2755 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2756 if not self.__GetNextToken():\r
2757 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
2758 FfsFileObj.FdName = self.__Token\r
2759\r
2760 elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):\r
2761 self.__UndoToken()\r
2762 self.__GetSectionData( FfsFileObj, MacroDict)\r
860992ed
YZ
2763\r
2764 elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW':\r
2765 self.__UndoToken()\r
2766 self.__GetRAWData(FfsFileObj, MacroDict)\r
2767\r
30fdf114 2768 else:\r
64b2609f
LG
2769 FfsFileObj.CurrentLineNum = self.CurrentLineNumber\r
2770 FfsFileObj.CurrentLineContent = self.__CurrentLine()\r
97fa0ee9 2771 FfsFileObj.FileName = self.__Token.replace('$(SPACE)', ' ')\r
2bc3256c 2772 self.__VerifyFile(FfsFileObj.FileName)\r
0d2711a6 2773\r
30fdf114
LG
2774 if not self.__IsToken( "}"):\r
2775 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2776\r
860992ed
YZ
2777 ## __GetRAWData() method\r
2778 #\r
2779 # Get RAW data for FILE statement\r
2780 #\r
2781 # @param self The object pointer\r
2782 # @param FfsFileObj for whom section is got\r
2783 # @param MacroDict dictionary used to replace macro\r
2784 #\r
2785 def __GetRAWData(self, FfsFileObj, MacroDict = {}):\r
2786 FfsFileObj.FileName = []\r
cfaaf99b 2787 FfsFileObj.SubAlignment = []\r
860992ed
YZ
2788 while True:\r
2789 AlignValue = None\r
2790 if self.__GetAlignment():\r
ccaa7754 2791 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
e921f58d 2792 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
860992ed 2793 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
f475f1e2
YZ
2794 #For FFS, Auto is default option same to ""\r
2795 if not self.__Token == "Auto":\r
2796 AlignValue = self.__Token\r
860992ed
YZ
2797 if not self.__GetNextToken():\r
2798 raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
2799\r
2800 FileName = self.__Token.replace('$(SPACE)', ' ')\r
2801 if FileName == '}':\r
2802 self.__UndoToken()\r
2803 raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
860992ed
YZ
2804\r
2805 self.__VerifyFile(FileName)\r
2806 File = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir)\r
2807 FfsFileObj.FileName.append(File.Path)\r
cfaaf99b 2808 FfsFileObj.SubAlignment.append(AlignValue)\r
860992ed
YZ
2809\r
2810 if self.__IsToken( "}"):\r
2811 self.__UndoToken()\r
2812 break\r
2813\r
cfaaf99b
YZ
2814 if len(FfsFileObj.SubAlignment) == 1:\r
2815 FfsFileObj.SubAlignment = FfsFileObj.SubAlignment[0]\r
860992ed
YZ
2816 if len(FfsFileObj.FileName) == 1:\r
2817 FfsFileObj.FileName = FfsFileObj.FileName[0]\r
2818\r
30fdf114
LG
2819 ## __GetFileOpts() method\r
2820 #\r
2821 # Get options for FILE statement\r
2822 #\r
2823 # @param self The object pointer\r
2824 # @param FfsFileObj for whom options is got\r
2825 #\r
2826 def __GetFileOpts(self, FfsFileObj):\r
2827\r
2828 if self.__GetNextToken():\r
147a656b 2829 if TokenFindPattern.match(self.__Token):\r
30fdf114
LG
2830 FfsFileObj.KeyStringList.append(self.__Token)\r
2831 if self.__IsToken(","):\r
2832 while self.__GetNextToken():\r
147a656b 2833 if not TokenFindPattern.match(self.__Token):\r
30fdf114
LG
2834 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2835 FfsFileObj.KeyStringList.append(self.__Token)\r
2836\r
2837 if not self.__IsToken(","):\r
2838 break\r
2839\r
2840 else:\r
2841 self.__UndoToken()\r
2842\r
2843 if self.__IsKeyword( "FIXED", True):\r
2844 FfsFileObj.Fixed = True\r
2845\r
2846 if self.__IsKeyword( "CHECKSUM", True):\r
2847 FfsFileObj.CheckSum = True\r
2848\r
2849 if self.__GetAlignment():\r
ccaa7754 2850 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
e921f58d 2851 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
9053bc51 2852 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2853 #For FFS, Auto is default option same to ""\r
2854 if not self.__Token == "Auto":\r
2855 FfsFileObj.Alignment = self.__Token\r
30fdf114
LG
2856\r
2857 ## __GetAlignment() method\r
2858 #\r
2859 # Return the alignment value\r
2860 #\r
2861 # @param self The object pointer\r
2862 # @retval True Successfully find alignment\r
2863 # @retval False Not able to find alignment\r
2864 #\r
2865 def __GetAlignment(self):\r
2866 if self.__IsKeyword( "Align", True):\r
2867 if not self.__IsToken( "="):\r
2868 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2869\r
2870 if not self.__GetNextToken():\r
2871 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2872 return True\r
2873\r
2874 return False\r
2875\r
2876 ## __GetFilePart() method\r
2877 #\r
2878 # Get section data for FILE statement\r
2879 #\r
2880 # @param self The object pointer\r
2881 # @param FfsFileObj for whom section is got\r
2882 # @param MacroDict dictionary used to replace macro\r
2883 #\r
2884 def __GetSectionData(self, FfsFileObj, MacroDict = {}):\r
2885 Dict = {}\r
2886 Dict.update(MacroDict)\r
2887\r
2888 self.__GetDefineStatements(FfsFileObj)\r
2889\r
2890 Dict.update(FfsFileObj.DefineVarDict)\r
2891 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2892 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2893\r
2894 while True:\r
2895 IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)\r
2896 IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)\r
2897 if not IsLeafSection and not IsEncapSection:\r
2898 break\r
2899\r
2900 ## __GetLeafSection() method\r
2901 #\r
2902 # Get leaf section for Obj\r
2903 #\r
2904 # @param self The object pointer\r
2905 # @param Obj for whom leaf section is got\r
2906 # @param MacroDict dictionary used to replace macro\r
2907 # @retval True Successfully find section statement\r
2908 # @retval False Not able to find section statement\r
2909 #\r
2910 def __GetLeafSection(self, Obj, MacroDict = {}):\r
2911\r
2912 OldPos = self.GetFileBufferPos()\r
2913\r
2914 if not self.__IsKeyword( "SECTION"):\r
2915 if len(Obj.SectionList) == 0:\r
2916 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2917 else:\r
2918 return False\r
2919\r
2920 AlignValue = None\r
2921 if self.__GetAlignment():\r
ccaa7754 2922 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
e921f58d 2923 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 2924 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2925 AlignValue = self.__Token\r
2926\r
2927 BuildNum = None\r
2928 if self.__IsKeyword( "BUILD_NUM"):\r
2929 if not self.__IsToken( "="):\r
2930 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2931\r
2932 if not self.__GetNextToken():\r
2933 raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber)\r
2934\r
2935 BuildNum = self.__Token\r
2936\r
2937 if self.__IsKeyword( "VERSION"):\r
52302d4d
LG
2938 if AlignValue == 'Auto':\r
2939 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2940 if not self.__IsToken( "="):\r
2941 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2942 if not self.__GetNextToken():\r
2943 raise Warning("expected version", self.FileName, self.CurrentLineNumber)\r
2944 VerSectionObj = VerSection.VerSection()\r
2945 VerSectionObj.Alignment = AlignValue\r
2946 VerSectionObj.BuildNum = BuildNum\r
2947 if self.__GetStringData():\r
2948 VerSectionObj.StringData = self.__Token\r
2949 else:\r
2950 VerSectionObj.FileName = self.__Token\r
2951 Obj.SectionList.append(VerSectionObj)\r
f7496d71 2952\r
91fa33ee 2953 elif self.__IsKeyword( BINARY_FILE_TYPE_UI):\r
52302d4d
LG
2954 if AlignValue == 'Auto':\r
2955 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2956 if not self.__IsToken( "="):\r
2957 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2958 if not self.__GetNextToken():\r
2959 raise Warning("expected UI", self.FileName, self.CurrentLineNumber)\r
2960 UiSectionObj = UiSection.UiSection()\r
2961 UiSectionObj.Alignment = AlignValue\r
2962 if self.__GetStringData():\r
2963 UiSectionObj.StringData = self.__Token\r
2964 else:\r
2965 UiSectionObj.FileName = self.__Token\r
2966 Obj.SectionList.append(UiSectionObj)\r
2967\r
2968 elif self.__IsKeyword( "FV_IMAGE"):\r
52302d4d
LG
2969 if AlignValue == 'Auto':\r
2970 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2971 if not self.__IsToken( "="):\r
2972 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2973 if not self.__GetNextToken():\r
2974 raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
2975\r
2976 FvName = self.__Token\r
2977 FvObj = None\r
2978\r
2979 if self.__IsToken( "{"):\r
2980 FvObj = Fv.FV()\r
2981 FvObj.UiFvName = FvName.upper()\r
2982 self.__GetDefineStatements(FvObj)\r
2983 MacroDict.update(FvObj.DefineVarDict)\r
2984 self.__GetBlockStatement(FvObj)\r
2985 self.__GetSetStatements(FvObj)\r
2986 self.__GetFvAlignment(FvObj)\r
2987 self.__GetFvAttributes(FvObj)\r
2988 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2989 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2990\r
2991 while True:\r
cdc9b0c2 2992 IsInf = self.__GetInfStatement(FvObj)\r
30fdf114
LG
2993 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2994 if not IsInf and not IsFile:\r
2995 break\r
2996\r
2997 if not self.__IsToken( "}"):\r
2998 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2999\r
3000 FvImageSectionObj = FvImageSection.FvImageSection()\r
3001 FvImageSectionObj.Alignment = AlignValue\r
4231a819 3002 if FvObj is not None:\r
30fdf114
LG
3003 FvImageSectionObj.Fv = FvObj\r
3004 FvImageSectionObj.FvName = None\r
3005 else:\r
3006 FvImageSectionObj.FvName = FvName.upper()\r
3007 FvImageSectionObj.FvFileName = FvName\r
3008\r
3009 Obj.SectionList.append(FvImageSectionObj)\r
3010\r
3011 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
52302d4d
LG
3012 if AlignValue == 'Auto':\r
3013 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3014 DepexSectionObj = DepexSection.DepexSection()\r
3015 DepexSectionObj.Alignment = AlignValue\r
3016 DepexSectionObj.DepexType = self.__Token\r
3017\r
3018 if not self.__IsToken( "="):\r
3019 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3020 if not self.__IsToken( "{"):\r
3021 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3022 if not self.__SkipToToken( "}"):\r
3023 raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
3024\r
3025 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
3026 Obj.SectionList.append(DepexSectionObj)\r
3027\r
3028 else:\r
30fdf114
LG
3029 if not self.__GetNextWord():\r
3030 raise Warning("expected section type", self.FileName, self.CurrentLineNumber)\r
3031\r
3032 # Encapsulation section appear, UndoToken and return\r
3033 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
3034 self.SetFileBufferPos(OldPos)\r
3035 return False\r
3036\r
91fa33ee
CJ
3037 if self.__Token not in ("COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
3038 BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX):\r
30fdf114 3039 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
91fa33ee 3040 if AlignValue == 'Auto'and (not self.__Token == BINARY_FILE_TYPE_PE32) and (not self.__Token == BINARY_FILE_TYPE_TE):\r
52302d4d
LG
3041 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
3042\r
30fdf114
LG
3043 # DataSection\r
3044 DataSectionObj = DataSection.DataSection()\r
3045 DataSectionObj.Alignment = AlignValue\r
3046 DataSectionObj.SecType = self.__Token\r
3047\r
3048 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3049 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
3050 if self.__Token == 'RELOCS_STRIPPED':\r
3051 DataSectionObj.KeepReloc = False\r
3052 else:\r
3053 DataSectionObj.KeepReloc = True\r
3054 else:\r
3055 raise Warning("File type %s, section type %s, could not have reloc strip flag%d" % (Obj.FvFileType, DataSectionObj.SecType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3056\r
3057 if self.__IsToken("="):\r
3058 if not self.__GetNextToken():\r
3059 raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
3060 DataSectionObj.SectFileName = self.__Token\r
2bc3256c 3061 self.__VerifyFile(DataSectionObj.SectFileName)\r
30fdf114
LG
3062 else:\r
3063 if not self.__GetCglSection(DataSectionObj):\r
3064 return False\r
3065\r
3066 Obj.SectionList.append(DataSectionObj)\r
3067\r
3068 return True\r
3069\r
2bc3256c
LG
3070 ## __VerifyFile\r
3071 #\r
3072 # Check if file exists or not:\r
3073 # If current phase if GenFds, the file must exist;\r
3074 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist\r
3075 # @param FileName: File path to be verified.\r
3076 #\r
3077 def __VerifyFile(self, FileName):\r
3078 if FileName.replace('$(WORKSPACE)', '').find('$') != -1:\r
3079 return\r
3080 if not GlobalData.gAutoGenPhase or not self.__GetMacroValue("OUTPUT_DIRECTORY") in FileName:\r
3081 ErrorCode, ErrorInfo = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3082 if ErrorCode != 0:\r
3083 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
3084\r
30fdf114
LG
3085 ## __GetCglSection() method\r
3086 #\r
3087 # Get compressed or GUIDed section for Obj\r
3088 #\r
3089 # @param self The object pointer\r
3090 # @param Obj for whom leaf section is got\r
3091 # @param AlignValue alignment value for complex section\r
3092 # @retval True Successfully find section statement\r
3093 # @retval False Not able to find section statement\r
3094 #\r
3095 def __GetCglSection(self, Obj, AlignValue = None):\r
3096\r
3097 if self.__IsKeyword( "COMPRESS"):\r
3098 type = "PI_STD"\r
3099 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3100 type = self.__Token\r
3101\r
3102 if not self.__IsToken("{"):\r
3103 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3104\r
3105 CompressSectionObj = CompressSection.CompressSection()\r
3106 CompressSectionObj.Alignment = AlignValue\r
3107 CompressSectionObj.CompType = type\r
3108 # Recursive sections...\r
3109 while True:\r
3110 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
3111 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
3112 if not IsLeafSection and not IsEncapSection:\r
3113 break\r
3114\r
3115\r
3116 if not self.__IsToken( "}"):\r
3117 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3118 Obj.SectionList.append(CompressSectionObj)\r
3119\r
3120# else:\r
3121# raise Warning("Compress type not known")\r
3122\r
3123 return True\r
3124\r
3125 elif self.__IsKeyword( "GUIDED"):\r
3126 GuidValue = None\r
3127 if self.__GetNextGuid():\r
3128 GuidValue = self.__Token\r
3129\r
3130 AttribDict = self.__GetGuidAttrib()\r
3131 if not self.__IsToken("{"):\r
3132 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3133 GuidSectionObj = GuidSection.GuidSection()\r
3134 GuidSectionObj.Alignment = AlignValue\r
3135 GuidSectionObj.NameGuid = GuidValue\r
3136 GuidSectionObj.SectionType = "GUIDED"\r
3137 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3138 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
25918452 3139 GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"]\r
30fdf114
LG
3140 # Recursive sections...\r
3141 while True:\r
3142 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
3143 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
3144 if not IsLeafSection and not IsEncapSection:\r
3145 break\r
3146\r
3147 if not self.__IsToken( "}"):\r
3148 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3149 Obj.SectionList.append(GuidSectionObj)\r
3150\r
3151 return True\r
3152\r
3153 return False\r
3154\r
3155 ## __GetGuidAttri() method\r
3156 #\r
3157 # Get attributes for GUID section\r
3158 #\r
3159 # @param self The object pointer\r
3160 # @retval AttribDict Dictionary of key-value pair of section attributes\r
3161 #\r
3162 def __GetGuidAttrib(self):\r
3163\r
3164 AttribDict = {}\r
14c48571 3165 AttribDict["PROCESSING_REQUIRED"] = "NONE"\r
3166 AttribDict["AUTH_STATUS_VALID"] = "NONE"\r
25918452
LG
3167 AttribDict["EXTRA_HEADER_SIZE"] = -1\r
3168 while self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID") \\r
3169 or self.__IsKeyword("EXTRA_HEADER_SIZE"):\r
30fdf114
LG
3170 AttribKey = self.__Token\r
3171\r
3172 if not self.__IsToken("="):\r
3173 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3174\r
25918452
LG
3175 if not self.__GetNextToken():\r
3176 raise Warning("expected TRUE(1)/FALSE(0)/Number", self.FileName, self.CurrentLineNumber)\r
3177 elif AttribKey == "EXTRA_HEADER_SIZE":\r
3178 Base = 10\r
3179 if self.__Token[0:2].upper() == "0X":\r
3180 Base = 16\r
3181 try:\r
3182 AttribDict[AttribKey] = int(self.__Token, Base)\r
3183 continue\r
3184 except ValueError:\r
3185 raise Warning("expected Number", self.FileName, self.CurrentLineNumber)\r
3186 elif self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
30fdf114
LG
3187 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
3188 AttribDict[AttribKey] = self.__Token\r
3189\r
3190 return AttribDict\r
3191\r
3192 ## __GetEncapsulationSec() method\r
3193 #\r
3194 # Get encapsulation section for FILE\r
3195 #\r
3196 # @param self The object pointer\r
3197 # @param FfsFile for whom section is got\r
3198 # @retval True Successfully find section statement\r
3199 # @retval False Not able to find section statement\r
3200 #\r
3201 def __GetEncapsulationSec(self, FfsFileObj):\r
3202\r
3203 OldPos = self.GetFileBufferPos()\r
3204 if not self.__IsKeyword( "SECTION"):\r
3205 if len(FfsFileObj.SectionList) == 0:\r
3206 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
3207 else:\r
3208 return False\r
3209\r
3210 AlignValue = None\r
3211 if self.__GetAlignment():\r
ccaa7754 3212 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
e921f58d 3213 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 3214 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3215 AlignValue = self.__Token\r
3216\r
3217 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
3218 self.SetFileBufferPos(OldPos)\r
3219 return False\r
3220 else:\r
3221 return True\r
3222\r
a3251d84
YL
3223 def __GetFmp(self):\r
3224 if not self.__GetNextToken():\r
3225 return False\r
3226 S = self.__Token.upper()\r
df81077f
YZ
3227 if S.startswith("[") and not S.startswith("[FMPPAYLOAD."):\r
3228 self.SectionParser(S)\r
a3251d84
YL
3229 self.__UndoToken()\r
3230 return False\r
3231\r
3232 self.__UndoToken()\r
3233 self.__SkipToToken("[FMPPAYLOAD.", True)\r
3234 FmpUiName = self.__GetUiName().upper()\r
3235 if FmpUiName in self.Profile.FmpPayloadDict:\r
3236 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName, self.FileName, self.CurrentLineNumber)\r
3237\r
3238 FmpData = CapsuleData.CapsulePayload()\r
3239 FmpData.UiName = FmpUiName\r
3240\r
3241 if not self.__IsToken( "]"):\r
3242 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3243\r
3244 if not self.__GetNextToken():\r
3245 raise Warning("The FMP payload section is empty!", self.FileName, self.CurrentLineNumber)\r
91ae2988 3246 FmpKeyList = ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT']\r
a3251d84
YL
3247 while self.__Token in FmpKeyList:\r
3248 Name = self.__Token\r
3249 FmpKeyList.remove(Name)\r
3250 if not self.__IsToken("="):\r
3251 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3252 if Name == 'IMAGE_TYPE_ID':\r
3253 if not self.__GetNextGuid():\r
91ae2988 3254 raise Warning("expected GUID value for IMAGE_TYPE_ID.", self.FileName, self.CurrentLineNumber)\r
a3251d84 3255 FmpData.ImageTypeId = self.__Token\r
91ae2988
YZ
3256 elif Name == 'CERTIFICATE_GUID':\r
3257 if not self.__GetNextGuid():\r
3258 raise Warning("expected GUID value for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
3259 FmpData.Certificate_Guid = self.__Token\r
3260 if uuid.UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_RSA2048_SHA256_GUID and uuid.UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_PKCS7_GUID:\r
3261 raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
a3251d84
YL
3262 else:\r
3263 if not self.__GetNextToken():\r
3264 raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber)\r
3265 Value = self.__Token\r
3266 if Name == 'IMAGE_HEADER_INIT_VERSION':\r
227dbb11 3267 if FdfParser.__Verify(Name, Value, 'UINT8'):\r
91ae2988 3268 FmpData.Version = Value\r
a3251d84 3269 elif Name == 'IMAGE_INDEX':\r
227dbb11 3270 if FdfParser.__Verify(Name, Value, 'UINT8'):\r
91ae2988 3271 FmpData.ImageIndex = Value\r
a3251d84 3272 elif Name == 'HARDWARE_INSTANCE':\r
227dbb11 3273 if FdfParser.__Verify(Name, Value, 'UINT8'):\r
91ae2988
YZ
3274 FmpData.HardwareInstance = Value\r
3275 elif Name == 'MONOTONIC_COUNT':\r
227dbb11 3276 if FdfParser.__Verify(Name, Value, 'UINT64'):\r
91ae2988
YZ
3277 FmpData.MonotonicCount = Value\r
3278 if FmpData.MonotonicCount.upper().startswith('0X'):\r
3279 FmpData.MonotonicCount = (long)(FmpData.MonotonicCount, 16)\r
3280 else:\r
3281 FmpData.MonotonicCount = (long)(FmpData.MonotonicCount)\r
a3251d84
YL
3282 if not self.__GetNextToken():\r
3283 break\r
3284 else:\r
3285 self.__UndoToken()\r
3286\r
91ae2988
YZ
3287 if (FmpData.MonotonicCount and not FmpData.Certificate_Guid) or (not FmpData.MonotonicCount and FmpData.Certificate_Guid):\r
3288 EdkLogger.error("FdfParser", FORMAT_INVALID, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.")\r
9ce9bf53
YZ
3289\r
3290 # Only the IMAGE_TYPE_ID is required item\r
3291 if FmpKeyList and 'IMAGE_TYPE_ID' in FmpKeyList:\r
3292 raise Warning("Missing keywords IMAGE_TYPE_ID in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
19e3aa7a
YZ
3293 # get the Image file and Vendor code file\r
3294 self.__GetFMPCapsuleData(FmpData)\r
3295 if not FmpData.ImageFile:\r
91ae2988 3296 raise Warning("Missing image file in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
19e3aa7a
YZ
3297 # check whether more than one Vendor code file\r
3298 if len(FmpData.VendorCodeFile) > 1:\r
91ae2988 3299 raise Warning("At most one Image file and one Vendor code file are allowed in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
a3251d84
YL
3300 self.Profile.FmpPayloadDict[FmpUiName] = FmpData\r
3301 return True\r
3302\r
30fdf114
LG
3303 ## __GetCapsule() method\r
3304 #\r
3305 # Get capsule section contents and store its data into capsule list of self.Profile\r
3306 #\r
3307 # @param self The object pointer\r
3308 # @retval True Successfully find a capsule\r
3309 # @retval False Not able to find a capsule\r
3310 #\r
3311 def __GetCapsule(self):\r
3312\r
3313 if not self.__GetNextToken():\r
3314 return False\r
3315\r
3316 S = self.__Token.upper()\r
3317 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
df81077f 3318 self.SectionParser(S)\r
30fdf114
LG
3319 self.__UndoToken()\r
3320 return False\r
3321\r
3322 self.__UndoToken()\r
3323 if not self.__IsToken("[CAPSULE.", True):\r
3324 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3325 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3326 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3327 raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber)\r
3328\r
3329 CapsuleObj = Capsule.Capsule()\r
3330\r
3331 CapsuleName = self.__GetUiName()\r
3332 if not CapsuleName:\r
3333 raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber)\r
3334\r
3335 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
3336\r
3337 if not self.__IsToken( "]"):\r
3338 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3339\r
3340 if self.__IsKeyword("CREATE_FILE"):\r
3341 if not self.__IsToken( "="):\r
3342 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3343\r
3344 if not self.__GetNextToken():\r
3345 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
3346\r
3347 CapsuleObj.CreateFile = self.__Token\r
3348\r
3349 self.__GetCapsuleStatements(CapsuleObj)\r
fd171542 3350 self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj\r
30fdf114
LG
3351 return True\r
3352\r
3353 ## __GetCapsuleStatements() method\r
3354 #\r
3355 # Get statements for capsule\r
3356 #\r
3357 # @param self The object pointer\r
3358 # @param Obj for whom statements are got\r
3359 #\r
3360 def __GetCapsuleStatements(self, Obj):\r
3361 self.__GetCapsuleTokens(Obj)\r
3362 self.__GetDefineStatements(Obj)\r
3363 self.__GetSetStatements(Obj)\r
30fdf114
LG
3364 self.__GetCapsuleData(Obj)\r
3365\r
fd171542 3366 ## __GetCapsuleTokens() method\r
30fdf114
LG
3367 #\r
3368 # Get token statements for capsule\r
3369 #\r
3370 # @param self The object pointer\r
3371 # @param Obj for whom token statements are got\r
3372 #\r
3373 def __GetCapsuleTokens(self, Obj):\r
b303ea72
LG
3374 if not self.__GetNextToken():\r
3375 return False\r
a3251d84 3376 while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):\r
b303ea72
LG
3377 Name = self.__Token.strip()\r
3378 if not self.__IsToken("="):\r
3379 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3380 if not self.__GetNextToken():\r
3381 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
3382 if Name == 'CAPSULE_FLAGS':\r
3383 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
3384 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
3385 Value = self.__Token.strip()\r
3386 while self.__IsToken(","):\r
3387 Value += ','\r
3388 if not self.__GetNextToken():\r
3389 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
3390 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
3391 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
3392 Value += self.__Token.strip()\r
e8a47801
LG
3393 elif Name == 'OEM_CAPSULE_FLAGS':\r
3394 Value = self.__Token.strip()\r
2bc3256c
LG
3395 if not Value.upper().startswith('0X'):\r
3396 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801
LG
3397 try:\r
3398 Value = int(Value, 0)\r
3399 except ValueError:\r
2bc3256c 3400 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801 3401 if not 0x0000 <= Value <= 0xFFFF:\r
2bc3256c 3402 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801 3403 Value = self.__Token.strip()\r
b303ea72
LG
3404 else:\r
3405 Value = self.__Token.strip()\r
f7496d71 3406 Obj.TokensDict[Name] = Value\r
b303ea72
LG
3407 if not self.__GetNextToken():\r
3408 return False\r
3409 self.__UndoToken()\r
30fdf114
LG
3410\r
3411 ## __GetCapsuleData() method\r
3412 #\r
3413 # Get capsule data for capsule\r
3414 #\r
3415 # @param self The object pointer\r
3416 # @param Obj for whom capsule data are got\r
3417 #\r
3418 def __GetCapsuleData(self, Obj):\r
3419\r
3420 while True:\r
3421 IsInf = self.__GetInfStatement(Obj, True)\r
3422 IsFile = self.__GetFileStatement(Obj, True)\r
3423 IsFv = self.__GetFvStatement(Obj)\r
b36d134f
LG
3424 IsFd = self.__GetFdStatement(Obj)\r
3425 IsAnyFile = self.__GetAnyFileStatement(Obj)\r
2bc3256c 3426 IsAfile = self.__GetAfileStatement(Obj)\r
a3251d84
YL
3427 IsFmp = self.__GetFmpStatement(Obj)\r
3428 if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile or IsAfile or IsFmp):\r
30fdf114
LG
3429 break\r
3430\r
19e3aa7a
YZ
3431 ## __GetFMPCapsuleData() method\r
3432 #\r
3433 # Get capsule data for FMP capsule\r
3434 #\r
3435 # @param self The object pointer\r
3436 # @param Obj for whom capsule data are got\r
3437 #\r
3438 def __GetFMPCapsuleData(self, Obj):\r
3439\r
3440 while True:\r
3441 IsFv = self.__GetFvStatement(Obj, True)\r
3442 IsFd = self.__GetFdStatement(Obj, True)\r
3443 IsAnyFile = self.__GetAnyFileStatement(Obj, True)\r
3444 if not (IsFv or IsFd or IsAnyFile):\r
3445 break\r
3446\r
30fdf114
LG
3447 ## __GetFvStatement() method\r
3448 #\r
3449 # Get FV for capsule\r
3450 #\r
3451 # @param self The object pointer\r
3452 # @param CapsuleObj for whom FV is got\r
3453 # @retval True Successfully find a FV statement\r
3454 # @retval False Not able to find a FV statement\r
3455 #\r
19e3aa7a 3456 def __GetFvStatement(self, CapsuleObj, FMPCapsule = False):\r
30fdf114 3457\r
91fa33ee 3458 if not self.__IsKeyword(BINARY_FILE_TYPE_FV):\r
30fdf114
LG
3459 return False\r
3460\r
3461 if not self.__IsToken("="):\r
3462 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3463\r
3464 if not self.__GetNextToken():\r
3465 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
3466\r
9eb87141 3467 if self.__Token.upper() not in self.Profile.FvDict:\r
2bcc713e
LG
3468 raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
3469\r
30fdf114
LG
3470 CapsuleFv = CapsuleData.CapsuleFv()\r
3471 CapsuleFv.FvName = self.__Token\r
19e3aa7a
YZ
3472 if FMPCapsule:\r
3473 if not CapsuleObj.ImageFile:\r
3474 CapsuleObj.ImageFile.append(CapsuleFv)\r
3475 else:\r
3476 CapsuleObj.VendorCodeFile.append(CapsuleFv)\r
3477 else:\r
3478 CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
30fdf114
LG
3479 return True\r
3480\r
b36d134f
LG
3481 ## __GetFdStatement() method\r
3482 #\r
3483 # Get FD for capsule\r
3484 #\r
3485 # @param self The object pointer\r
3486 # @param CapsuleObj for whom FD is got\r
3487 # @retval True Successfully find a FD statement\r
3488 # @retval False Not able to find a FD statement\r
3489 #\r
19e3aa7a 3490 def __GetFdStatement(self, CapsuleObj, FMPCapsule = False):\r
b36d134f
LG
3491\r
3492 if not self.__IsKeyword("FD"):\r
3493 return False\r
3494\r
3495 if not self.__IsToken("="):\r
3496 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3497\r
3498 if not self.__GetNextToken():\r
3499 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
3500\r
9eb87141 3501 if self.__Token.upper() not in self.Profile.FdDict:\r
2bcc713e
LG
3502 raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
3503\r
b36d134f
LG
3504 CapsuleFd = CapsuleData.CapsuleFd()\r
3505 CapsuleFd.FdName = self.__Token\r
19e3aa7a
YZ
3506 if FMPCapsule:\r
3507 if not CapsuleObj.ImageFile:\r
3508 CapsuleObj.ImageFile.append(CapsuleFd)\r
3509 else:\r
3510 CapsuleObj.VendorCodeFile.append(CapsuleFd)\r
3511 else:\r
3512 CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
b36d134f
LG
3513 return True\r
3514\r
a3251d84 3515 def __GetFmpStatement(self, CapsuleObj):\r
df81077f
YZ
3516 if not self.__IsKeyword("FMP_PAYLOAD"):\r
3517 if not self.__IsKeyword("FMP"):\r
3518 return False\r
b36d134f 3519\r
df81077f
YZ
3520 if not self.__IsKeyword("PAYLOAD"):\r
3521 self.__UndoToken()\r
3522 return False\r
b36d134f 3523\r
a3251d84
YL
3524 if not self.__IsToken("="):\r
3525 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3526\r
3527 if not self.__GetNextToken():\r
df81077f 3528 raise Warning("expected payload name after FMP_PAYLOAD =", self.FileName, self.CurrentLineNumber)\r
a3251d84
YL
3529 Payload = self.__Token.upper()\r
3530 if Payload not in self.Profile.FmpPayloadDict:\r
3531 raise Warning("This FMP Payload does not exist: %s" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3532 CapsuleObj.FmpPayloadList.append(self.Profile.FmpPayloadDict[Payload])\r
3533 return True\r
3534\r
3535 def __ParseRawFileStatement(self):\r
3536 if not self.__IsKeyword("FILE"):\r
3537 return None\r
3538\r
b36d134f
LG
3539 if not self.__IsKeyword("DATA"):\r
3540 self.__UndoToken()\r
a3251d84 3541 return None\r
b36d134f
LG
3542\r
3543 if not self.__IsToken("="):\r
3544 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3545\r
3546 if not self.__GetNextToken():\r
3547 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
f7496d71 3548\r
b36d134f 3549 AnyFileName = self.__Token\r
35217a33
YZ
3550 self.__VerifyFile(AnyFileName)\r
3551\r
94e4bcbb
YZ
3552 if not os.path.isabs(AnyFileName):\r
3553 AnyFileName = mws.join(GenFdsGlobalVariable.WorkSpaceDir, AnyFileName)\r
3554\r
a3251d84
YL
3555 return AnyFileName\r
3556\r
3557 ## __GetAnyFileStatement() method\r
3558 #\r
3559 # Get AnyFile for capsule\r
3560 #\r
3561 # @param self The object pointer\r
3562 # @param CapsuleObj for whom AnyFile is got\r
3563 # @retval True Successfully find a Anyfile statement\r
3564 # @retval False Not able to find a AnyFile statement\r
3565 #\r
19e3aa7a 3566 def __GetAnyFileStatement(self, CapsuleObj, FMPCapsule = False):\r
a3251d84
YL
3567 AnyFileName = self.__ParseRawFileStatement()\r
3568 if not AnyFileName:\r
3569 return False\r
b36d134f
LG
3570\r
3571 CapsuleAnyFile = CapsuleData.CapsuleAnyFile()\r
3572 CapsuleAnyFile.FileName = AnyFileName\r
19e3aa7a
YZ
3573 if FMPCapsule:\r
3574 if not CapsuleObj.ImageFile:\r
3575 CapsuleObj.ImageFile.append(CapsuleAnyFile)\r
3576 else:\r
3577 CapsuleObj.VendorCodeFile.append(CapsuleAnyFile)\r
3578 else:\r
3579 CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
b36d134f 3580 return True\r
f7496d71 3581\r
2bc3256c
LG
3582 ## __GetAfileStatement() method\r
3583 #\r
3584 # Get Afile for capsule\r
3585 #\r
3586 # @param self The object pointer\r
3587 # @param CapsuleObj for whom Afile is got\r
3588 # @retval True Successfully find a Afile statement\r
3589 # @retval False Not able to find a Afile statement\r
3590 #\r
3591 def __GetAfileStatement(self, CapsuleObj):\r
3592\r
3593 if not self.__IsKeyword("APPEND"):\r
3594 return False\r
3595\r
3596 if not self.__IsToken("="):\r
3597 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3598\r
3599 if not self.__GetNextToken():\r
3600 raise Warning("expected Afile name", self.FileName, self.CurrentLineNumber)\r
f7496d71 3601\r
2bc3256c
LG
3602 AfileName = self.__Token\r
3603 AfileBaseName = os.path.basename(AfileName)\r
f7496d71 3604\r
ccaa7754 3605 if os.path.splitext(AfileBaseName)[1] not in [".bin", ".BIN", ".Bin", ".dat", ".DAT", ".Dat", ".data", ".DATA", ".Data"]:\r
91fa33ee 3606 raise Warning('invalid binary file type, should be one of "bin",BINARY_FILE_TYPE_BIN,"Bin","dat","DAT","Dat","data","DATA","Data"', \\r
2bc3256c 3607 self.FileName, self.CurrentLineNumber)\r
f7496d71 3608\r
2bc3256c
LG
3609 if not os.path.isabs(AfileName):\r
3610 AfileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AfileName)\r
3611 self.__VerifyFile(AfileName)\r
3612 else:\r
3613 if not os.path.exists(AfileName):\r
3614 raise Warning('%s does not exist' % AfileName, self.FileName, self.CurrentLineNumber)\r
3615 else:\r
3616 pass\r
3617\r
3618 CapsuleAfile = CapsuleData.CapsuleAfile()\r
3619 CapsuleAfile.FileName = AfileName\r
3620 CapsuleObj.CapsuleDataList.append(CapsuleAfile)\r
3621 return True\r
b36d134f 3622\r
30fdf114
LG
3623 ## __GetRule() method\r
3624 #\r
3625 # Get Rule section contents and store its data into rule list of self.Profile\r
3626 #\r
3627 # @param self The object pointer\r
3628 # @retval True Successfully find a Rule\r
3629 # @retval False Not able to find a Rule\r
3630 #\r
3631 def __GetRule(self):\r
3632\r
3633 if not self.__GetNextToken():\r
3634 return False\r
3635\r
3636 S = self.__Token.upper()\r
3637 if S.startswith("[") and not S.startswith("[RULE."):\r
df81077f 3638 self.SectionParser(S)\r
30fdf114
LG
3639 self.__UndoToken()\r
3640 return False\r
3641 self.__UndoToken()\r
3642 if not self.__IsToken("[Rule.", True):\r
3643 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3644 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3645 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3646 raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber)\r
3647\r
3648 if not self.__SkipToToken("."):\r
3649 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3650\r
3651 Arch = self.__SkippedChars.rstrip(".")\r
eece4292 3652 if Arch.upper() not in ARCH_SET_FULL:\r
30fdf114
LG
3653 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
3654\r
3655 ModuleType = self.__GetModuleType()\r
3656\r
3657 TemplateName = ""\r
3658 if self.__IsToken("."):\r
3659 if not self.__GetNextWord():\r
3660 raise Warning("expected template name", self.FileName, self.CurrentLineNumber)\r
3661 TemplateName = self.__Token\r
3662\r
3663 if not self.__IsToken( "]"):\r
3664 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3665\r
3666 RuleObj = self.__GetRuleFileStatements()\r
3667 RuleObj.Arch = Arch.upper()\r
3668 RuleObj.ModuleType = ModuleType\r
3669 RuleObj.TemplateName = TemplateName\r
3670 if TemplateName == '' :\r
3671 self.Profile.RuleDict['RULE' + \\r
3672 '.' + \\r
3673 Arch.upper() + \\r
3674 '.' + \\r
3675 ModuleType.upper() ] = RuleObj\r
3676 else :\r
3677 self.Profile.RuleDict['RULE' + \\r
3678 '.' + \\r
3679 Arch.upper() + \\r
3680 '.' + \\r
3681 ModuleType.upper() + \\r
3682 '.' + \\r
3683 TemplateName.upper() ] = RuleObj\r
3684# self.Profile.RuleList.append(rule)\r
3685 return True\r
3686\r
3687 ## __GetModuleType() method\r
3688 #\r
3689 # Return the module type\r
3690 #\r
3691 # @param self The object pointer\r
3692 # @retval string module type\r
3693 #\r
3694 def __GetModuleType(self):\r
3695\r
3696 if not self.__GetNextWord():\r
3697 raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
8bb63e37
CJ
3698 if self.__Token.upper() not in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_DXE_CORE, \\r
3699 SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, \\r
3700 SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, \\r
3701 SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_USER_DEFINED, "DEFAULT", SUP_MODULE_BASE, \\r
0c60e60b
CJ
3702 EDK_COMPONENT_TYPE_SECURITY_CORE, EDK_COMPONENT_TYPE_COMBINED_PEIM_DRIVER, EDK_COMPONENT_TYPE_PIC_PEIM, EDK_COMPONENT_TYPE_RELOCATABLE_PEIM, \\r
3703 "PE32_PEIM", EDK_COMPONENT_TYPE_BS_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER, EDK_COMPONENT_TYPE_SAL_RT_DRIVER, EDK_COMPONENT_TYPE_APPLICATION, "ACPITABLE", SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE):\r
30fdf114
LG
3704 raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3705 return self.__Token\r
3706\r
3707 ## __GetFileExtension() method\r
3708 #\r
3709 # Return the file extension\r
3710 #\r
3711 # @param self The object pointer\r
3712 # @retval string file name extension\r
3713 #\r
3714 def __GetFileExtension(self):\r
3715 if not self.__IsToken("."):\r
df81077f 3716 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3717\r
3718 Ext = ""\r
3719 if self.__GetNextToken():\r
4d603daa 3720 if FileExtensionPattern.match(self.__Token):\r
30fdf114
LG
3721 Ext = self.__Token\r
3722 return '.' + Ext\r
3723 else:\r
3724 raise Warning("Unknown file extension '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3725\r
3726 else:\r
3727 raise Warning("expected file extension", self.FileName, self.CurrentLineNumber)\r
3728\r
3729 ## __GetRuleFileStatement() method\r
3730 #\r
3731 # Get rule contents\r
3732 #\r
3733 # @param self The object pointer\r
3734 # @retval Rule Rule object\r
3735 #\r
3736 def __GetRuleFileStatements(self):\r
3737\r
3738 if not self.__IsKeyword("FILE"):\r
3739 raise Warning("expected FILE", self.FileName, self.CurrentLineNumber)\r
3740\r
3741 if not self.__GetNextWord():\r
3742 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
3743\r
3744 Type = self.__Token.strip().upper()\r
8bb63e37 3745 if Type not in ("RAW", "FREEFORM", SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM,\\r
0c60e60b 3746 "PEI_DXE_COMBO", "DRIVER", SUP_MODULE_DXE_CORE, EDK_COMPONENT_TYPE_APPLICATION, "FV_IMAGE", "SMM", SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE):\r
30fdf114
LG
3747 raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3748\r
3749 if not self.__IsToken("="):\r
3750 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3751\r
3752 if not self.__IsKeyword("$(NAMED_GUID)"):\r
3753 if not self.__GetNextWord():\r
3754 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
3755 if self.__Token == 'PCD':\r
3756 if not self.__IsToken( "("):\r
3757 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
543f5ac3 3758 PcdPair = self.__GetNextPcdSettings()\r
30fdf114
LG
3759 if not self.__IsToken( ")"):\r
3760 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3761 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
f7496d71 3762\r
30fdf114
LG
3763 NameGuid = self.__Token\r
3764\r
3765 KeepReloc = None\r
3766 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3767 if self.__FileCouldHaveRelocFlag(Type):\r
3768 if self.__Token == 'RELOCS_STRIPPED':\r
3769 KeepReloc = False\r
3770 else:\r
3771 KeepReloc = True\r
3772 else:\r
3773 raise Warning("File type %s could not have reloc strip flag%d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3774\r
3775 KeyStringList = []\r
3776 if self.__GetNextToken():\r
147a656b 3777 if TokenFindPattern.match(self.__Token):\r
30fdf114
LG
3778 KeyStringList.append(self.__Token)\r
3779 if self.__IsToken(","):\r
3780 while self.__GetNextToken():\r
147a656b 3781 if not TokenFindPattern.match(self.__Token):\r
30fdf114
LG
3782 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
3783 KeyStringList.append(self.__Token)\r
3784\r
3785 if not self.__IsToken(","):\r
3786 break\r
3787\r
3788 else:\r
3789 self.__UndoToken()\r
3790\r
3791\r
3792 Fixed = False\r
3793 if self.__IsKeyword("Fixed", True):\r
3794 Fixed = True\r
3795\r
3796 CheckSum = False\r
3797 if self.__IsKeyword("CheckSum", True):\r
3798 CheckSum = True\r
3799\r
3800 AlignValue = ""\r
3801 if self.__GetAlignment():\r
ccaa7754 3802 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
e921f58d 3803 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114 3804 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3805 #For FFS, Auto is default option same to ""\r
3806 if not self.__Token == "Auto":\r
3807 AlignValue = self.__Token\r
30fdf114
LG
3808\r
3809 if self.__IsToken("{"):\r
3810 # Complex file rule expected\r
3811 Rule = RuleComplexFile.RuleComplexFile()\r
3812 Rule.FvFileType = Type\r
3813 Rule.NameGuid = NameGuid\r
3814 Rule.Alignment = AlignValue\r
3815 Rule.CheckSum = CheckSum\r
3816 Rule.Fixed = Fixed\r
3817 Rule.KeyStringList = KeyStringList\r
4231a819 3818 if KeepReloc is not None:\r
30fdf114
LG
3819 Rule.KeepReloc = KeepReloc\r
3820\r
3821 while True:\r
3822 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
3823 IsLeaf = self.__GetEfiSection(Rule)\r
3824 if not IsEncapsulate and not IsLeaf:\r
3825 break\r
3826\r
3827 if not self.__IsToken("}"):\r
3828 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3829\r
3830 return Rule\r
3831\r
30fdf114
LG
3832 else:\r
3833 # Simple file rule expected\r
3834 if not self.__GetNextWord():\r
3835 raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber)\r
3836\r
3837 SectionName = self.__Token\r
3838\r
91fa33ee
CJ
3839 if SectionName not in ("COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
3840 BINARY_FILE_TYPE_UI, BINARY_FILE_TYPE_PEI_DEPEX, "VERSION", "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX):\r
30fdf114
LG
3841 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
3842\r
3843\r
3844 if self.__IsKeyword("Fixed", True):\r
3845 Fixed = True\r
3846\r
3847 if self.__IsKeyword("CheckSum", True):\r
3848 CheckSum = True\r
3849\r
52302d4d 3850 SectAlignment = ""\r
30fdf114 3851 if self.__GetAlignment():\r
ccaa7754 3852 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
e921f58d 3853 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114 3854 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
91fa33ee 3855 if self.__Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32) and (not SectionName == BINARY_FILE_TYPE_TE):\r
52302d4d
LG
3856 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
3857 SectAlignment = self.__Token\r
3858\r
3859 Ext = None\r
3860 if self.__IsToken('|'):\r
3861 Ext = self.__GetFileExtension()\r
3862 elif not self.__GetNextToken():\r
30fdf114
LG
3863 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3864\r
3865 Rule = RuleSimpleFile.RuleSimpleFile()\r
3866 Rule.SectionType = SectionName\r
3867 Rule.FvFileType = Type\r
3868 Rule.NameGuid = NameGuid\r
3869 Rule.Alignment = AlignValue\r
52302d4d 3870 Rule.SectAlignment = SectAlignment\r
30fdf114
LG
3871 Rule.CheckSum = CheckSum\r
3872 Rule.Fixed = Fixed\r
30fdf114 3873 Rule.KeyStringList = KeyStringList\r
4231a819 3874 if KeepReloc is not None:\r
30fdf114 3875 Rule.KeepReloc = KeepReloc\r
52302d4d
LG
3876 Rule.FileExtension = Ext\r
3877 Rule.FileName = self.__Token\r
30fdf114
LG
3878 return Rule\r
3879\r
3880 ## __GetEfiSection() method\r
3881 #\r
3882 # Get section list for Rule\r
3883 #\r
3884 # @param self The object pointer\r
3885 # @param Obj for whom section is got\r
3886 # @retval True Successfully find section statement\r
3887 # @retval False Not able to find section statement\r
3888 #\r
3889 def __GetEfiSection(self, Obj):\r
3890\r
3891 OldPos = self.GetFileBufferPos()\r
3892 if not self.__GetNextWord():\r
3893 return False\r
3894 SectionName = self.__Token\r
3895\r
91fa33ee
CJ
3896 if SectionName not in ("COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
3897 BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, BINARY_FILE_TYPE_SMM_DEPEX):\r
30fdf114
LG
3898 self.__UndoToken()\r
3899 return False\r
3900\r
3901 if SectionName == "FV_IMAGE":\r
3902 FvImageSectionObj = FvImageSection.FvImageSection()\r
3903 if self.__IsKeyword("FV_IMAGE"):\r
3904 pass\r
3905 if self.__IsToken( "{"):\r
3906 FvObj = Fv.FV()\r
3907 self.__GetDefineStatements(FvObj)\r
3908 self.__GetBlockStatement(FvObj)\r
3909 self.__GetSetStatements(FvObj)\r
3910 self.__GetFvAlignment(FvObj)\r
3911 self.__GetFvAttributes(FvObj)\r
3912 self.__GetAprioriSection(FvObj)\r
3913 self.__GetAprioriSection(FvObj)\r
3914\r
3915 while True:\r
3916 IsInf = self.__GetInfStatement(FvObj)\r
3917 IsFile = self.__GetFileStatement(FvObj)\r
3918 if not IsInf and not IsFile:\r
3919 break\r
3920\r
3921 if not self.__IsToken( "}"):\r
3922 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3923 FvImageSectionObj.Fv = FvObj\r
3924 FvImageSectionObj.FvName = None\r
3925\r
3926 else:\r
91fa33ee
CJ
3927 if not self.__IsKeyword(BINARY_FILE_TYPE_FV):\r
3928 raise Warning("expected BINARY_FILE_TYPE_FV", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3929 FvImageSectionObj.FvFileType = self.__Token\r
3930\r
30fdf114 3931 if self.__GetAlignment():\r
ccaa7754 3932 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
e921f58d 3933 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114
LG
3934 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3935 FvImageSectionObj.Alignment = self.__Token\r
3936\r
3937 if self.__IsToken('|'):\r
3938 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3939 elif self.__GetNextToken():\r
91fa33ee
CJ
3940 if self.__Token not in ("}", "COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
3941 BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, BINARY_FILE_TYPE_SMM_DEPEX):\r
30fdf114
LG
3942 FvImageSectionObj.FvFileName = self.__Token\r
3943 else:\r
3944 self.__UndoToken()\r
3945 else:\r
3946 raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber)\r
3947\r
3948 Obj.SectionList.append(FvImageSectionObj)\r
3949 return True\r
3950\r
3951 EfiSectionObj = EfiSection.EfiSection()\r
3952 EfiSectionObj.SectionType = SectionName\r
3953\r
3954 if not self.__GetNextToken():\r
3955 raise Warning("expected file type", self.FileName, self.CurrentLineNumber)\r
3956\r
3957 if self.__Token == "STRING":\r
3958 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3959 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3960\r
3961 if not self.__IsToken('='):\r
3962 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3963\r
3964 if not self.__GetNextToken():\r
3965 raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber)\r
3966\r
3967 if self.__GetStringData():\r
3968 EfiSectionObj.StringData = self.__Token\r
3969\r
3970 if self.__IsKeyword("BUILD_NUM"):\r
3971 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3972 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3973\r
3974 if not self.__IsToken("="):\r
3975 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3976 if not self.__GetNextToken():\r
3977 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3978 EfiSectionObj.BuildNum = self.__Token\r
3979\r
3980 else:\r
3981 EfiSectionObj.FileType = self.__Token\r
3982 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3983\r
3984 if self.__IsKeyword("Optional"):\r
3985 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3986 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3987 EfiSectionObj.Optional = True\r
3988\r
3989 if self.__IsKeyword("BUILD_NUM"):\r
3990 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3991 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3992\r
3993 if not self.__IsToken("="):\r
3994 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3995 if not self.__GetNextToken():\r
3996 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3997 EfiSectionObj.BuildNum = self.__Token\r
3998\r
3999 if self.__GetAlignment():\r
ccaa7754 4000 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
e921f58d 4001 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 4002 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
91fa33ee 4003 if self.__Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32) and (not SectionName == BINARY_FILE_TYPE_TE):\r
52302d4d 4004 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
4005 EfiSectionObj.Alignment = self.__Token\r
4006\r
4007 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
4008 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
4009 if self.__Token == 'RELOCS_STRIPPED':\r
4010 EfiSectionObj.KeepReloc = False\r
4011 else:\r
4012 EfiSectionObj.KeepReloc = True\r
4231a819 4013 if Obj.KeepReloc is not None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
30fdf114
LG
4014 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
4015 else:\r
4016 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
4017\r
4018\r
4019 if self.__IsToken('|'):\r
4020 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
4021 elif self.__GetNextToken():\r
91fa33ee
CJ
4022 if self.__Token not in ("}", "COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
4023 BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, BINARY_FILE_TYPE_SMM_DEPEX):\r
f7496d71 4024\r
30fdf114
LG
4025 if self.__Token.startswith('PCD'):\r
4026 self.__UndoToken()\r
4027 self.__GetNextWord()\r
f7496d71 4028\r
30fdf114
LG
4029 if self.__Token == 'PCD':\r
4030 if not self.__IsToken( "("):\r
4031 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
543f5ac3 4032 PcdPair = self.__GetNextPcdSettings()\r
30fdf114
LG
4033 if not self.__IsToken( ")"):\r
4034 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
4035 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
f7496d71
LG
4036\r
4037 EfiSectionObj.FileName = self.__Token\r
4038\r
30fdf114
LG
4039 else:\r
4040 self.__UndoToken()\r
4041 else:\r
4042 raise Warning("expected section file name", self.FileName, self.CurrentLineNumber)\r
4043\r
4044 Obj.SectionList.append(EfiSectionObj)\r
4045 return True\r
4046\r
4047 ## __RuleSectionCouldBeOptional() method\r
4048 #\r
4049 # Get whether a section could be optional\r
4050 #\r
30fdf114
LG
4051 # @param SectionType The section type to check\r
4052 # @retval True section could be optional\r
4053 # @retval False section never optional\r
4054 #\r
5bcf1d56
CJ
4055 @staticmethod\r
4056 def __RuleSectionCouldBeOptional(SectionType):\r
91fa33ee 4057 if SectionType in (BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, "RAW", BINARY_FILE_TYPE_SMM_DEPEX):\r
30fdf114
LG
4058 return True\r
4059 else:\r
4060 return False\r
4061\r
4062 ## __RuleSectionCouldHaveBuildNum() method\r
4063 #\r
4064 # Get whether a section could have build number information\r
4065 #\r
30fdf114
LG
4066 # @param SectionType The section type to check\r
4067 # @retval True section could have build number information\r
4068 # @retval False section never have build number information\r
4069 #\r
5bcf1d56
CJ
4070 @staticmethod\r
4071 def __RuleSectionCouldHaveBuildNum(SectionType):\r
30fdf114
LG
4072 if SectionType in ("VERSION"):\r
4073 return True\r
4074 else:\r
4075 return False\r
4076\r
4077 ## __RuleSectionCouldHaveString() method\r
4078 #\r
4079 # Get whether a section could have string\r
4080 #\r
30fdf114
LG
4081 # @param SectionType The section type to check\r
4082 # @retval True section could have string\r
4083 # @retval False section never have string\r
4084 #\r
5bcf1d56
CJ
4085 @staticmethod\r
4086 def __RuleSectionCouldHaveString(SectionType):\r
91fa33ee 4087 if SectionType in (BINARY_FILE_TYPE_UI, "VERSION"):\r
30fdf114
LG
4088 return True\r
4089 else:\r
4090 return False\r
4091\r
4092 ## __CheckRuleSectionFileType() method\r
4093 #\r
4094 # Get whether a section matches a file type\r
4095 #\r
4096 # @param self The object pointer\r
4097 # @param SectionType The section type to check\r
4098 # @param FileType The file type to check\r
4099 #\r
4100 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
4101 if SectionType == "COMPAT16":\r
4102 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
4103 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
91fa33ee
CJ
4104 elif SectionType == BINARY_FILE_TYPE_PE32:\r
4105 if FileType not in (BINARY_FILE_TYPE_PE32, "SEC_PE32"):\r
30fdf114 4106 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
91fa33ee
CJ
4107 elif SectionType == BINARY_FILE_TYPE_PIC:\r
4108 if FileType not in (BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_PIC):\r
30fdf114 4109 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
91fa33ee
CJ
4110 elif SectionType == BINARY_FILE_TYPE_TE:\r
4111 if FileType not in (BINARY_FILE_TYPE_TE, "SEC_TE"):\r
30fdf114
LG
4112 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4113 elif SectionType == "RAW":\r
91fa33ee 4114 if FileType not in (BINARY_FILE_TYPE_BIN, "SEC_BIN", "RAW", "ASL", "ACPI"):\r
30fdf114 4115 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
91fa33ee
CJ
4116 elif SectionType == BINARY_FILE_TYPE_DXE_DEPEX or SectionType == BINARY_FILE_TYPE_SMM_DEPEX:\r
4117 if FileType not in (BINARY_FILE_TYPE_DXE_DEPEX, "SEC_DXE_DEPEX", BINARY_FILE_TYPE_SMM_DEPEX):\r
30fdf114 4118 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
91fa33ee
CJ
4119 elif SectionType == BINARY_FILE_TYPE_UI:\r
4120 if FileType not in (BINARY_FILE_TYPE_UI, "SEC_UI"):\r
30fdf114
LG
4121 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4122 elif SectionType == "VERSION":\r
4123 if FileType not in ("VERSION", "SEC_VERSION"):\r
4124 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
91fa33ee
CJ
4125 elif SectionType == BINARY_FILE_TYPE_PEI_DEPEX:\r
4126 if FileType not in (BINARY_FILE_TYPE_PEI_DEPEX, "SEC_PEI_DEPEX"):\r
30fdf114 4127 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
91fa33ee
CJ
4128 elif SectionType == BINARY_FILE_TYPE_GUID:\r
4129 if FileType not in (BINARY_FILE_TYPE_PE32, "SEC_GUID"):\r
30fdf114
LG
4130 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4131\r
4132 ## __GetRuleEncapsulationSection() method\r
4133 #\r
4134 # Get encapsulation section for Rule\r
4135 #\r
4136 # @param self The object pointer\r
4137 # @param Rule for whom section is got\r
4138 # @retval True Successfully find section statement\r
4139 # @retval False Not able to find section statement\r
4140 #\r
4141 def __GetRuleEncapsulationSection(self, Rule):\r
4142\r
4143 if self.__IsKeyword( "COMPRESS"):\r
4144 Type = "PI_STD"\r
4145 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
4146 Type = self.__Token\r
4147\r
4148 if not self.__IsToken("{"):\r
4149 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
4150\r
4151 CompressSectionObj = CompressSection.CompressSection()\r
4152\r
4153 CompressSectionObj.CompType = Type\r
4154 # Recursive sections...\r
4155 while True:\r
4156 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
4157 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
4158 if not IsEncapsulate and not IsLeaf:\r
4159 break\r
4160\r
4161 if not self.__IsToken( "}"):\r
4162 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
4163 Rule.SectionList.append(CompressSectionObj)\r
4164\r
4165 return True\r
4166\r
4167 elif self.__IsKeyword( "GUIDED"):\r
4168 GuidValue = None\r
4169 if self.__GetNextGuid():\r
4170 GuidValue = self.__Token\r
4171\r
4172 if self.__IsKeyword( "$(NAMED_GUID)"):\r
4173 GuidValue = self.__Token\r
4174\r
4175 AttribDict = self.__GetGuidAttrib()\r
4176\r
4177 if not self.__IsToken("{"):\r
4178 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
4179 GuidSectionObj = GuidSection.GuidSection()\r
4180 GuidSectionObj.NameGuid = GuidValue\r
4181 GuidSectionObj.SectionType = "GUIDED"\r
4182 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
4183 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
25918452 4184 GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"]\r
30fdf114
LG
4185\r
4186 # Efi sections...\r
4187 while True:\r
4188 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
4189 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
4190 if not IsEncapsulate and not IsLeaf:\r
4191 break\r
4192\r
4193 if not self.__IsToken( "}"):\r
4194 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
4195 Rule.SectionList.append(GuidSectionObj)\r
4196\r
4197 return True\r
4198\r
4199 return False\r
4200\r
4201 ## __GetVtf() method\r
4202 #\r
4203 # Get VTF section contents and store its data into VTF list of self.Profile\r
4204 #\r
4205 # @param self The object pointer\r
4206 # @retval True Successfully find a VTF\r
4207 # @retval False Not able to find a VTF\r
4208 #\r
4209 def __GetVtf(self):\r
4210\r
4211 if not self.__GetNextToken():\r
4212 return False\r
4213\r
4214 S = self.__Token.upper()\r
4215 if S.startswith("[") and not S.startswith("[VTF."):\r
df81077f 4216 self.SectionParser(S)\r
30fdf114
LG
4217 self.__UndoToken()\r
4218 return False\r
4219\r
4220 self.__UndoToken()\r
4221 if not self.__IsToken("[VTF.", True):\r
4222 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
4223 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
4224 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
4225 raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber)\r
4226\r
4227 if not self.__SkipToToken("."):\r
4228 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
4229\r
4230 Arch = self.__SkippedChars.rstrip(".").upper()\r
4afd3d04 4231 if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
4232 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
4233\r
4234 if not self.__GetNextWord():\r
4235 raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber)\r
4236 Name = self.__Token.upper()\r
4237\r
4238 VtfObj = Vtf.Vtf()\r
4239 VtfObj.UiName = Name\r
4240 VtfObj.KeyArch = Arch\r
4241\r
4242 if self.__IsToken(","):\r
4243 if not self.__GetNextWord():\r
4244 raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
4afd3d04 4245 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
4246 raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4247 VtfObj.ArchList = self.__Token.upper()\r
4248\r
4249 if not self.__IsToken( "]"):\r
4250 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
4251\r
4252 if self.__IsKeyword("IA32_RST_BIN"):\r
4253 if not self.__IsToken("="):\r
4254 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4255\r
4256 if not self.__GetNextToken():\r
4257 raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
4258\r
4259 VtfObj.ResetBin = self.__Token\r
6310ffd7 4260 if VtfObj.ResetBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
4261 #check for file path\r
4262 ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4263 if ErrorCode != 0:\r
4264 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4265\r
4266 while self.__GetComponentStatement(VtfObj):\r
4267 pass\r
4268\r
4269 self.Profile.VtfList.append(VtfObj)\r
4270 return True\r
4271\r
4272 ## __GetComponentStatement() method\r
4273 #\r
4274 # Get components in VTF\r
4275 #\r
4276 # @param self The object pointer\r
4277 # @param VtfObj for whom component is got\r
4278 # @retval True Successfully find a component\r
4279 # @retval False Not able to find a component\r
4280 #\r
4281 def __GetComponentStatement(self, VtfObj):\r
4282\r
4283 if not self.__IsKeyword("COMP_NAME"):\r
4284 return False\r
4285\r
4286 if not self.__IsToken("="):\r
4287 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4288\r
4289 if not self.__GetNextWord():\r
4290 raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber)\r
4291\r
4292 CompStatementObj = ComponentStatement.ComponentStatement()\r
4293 CompStatementObj.CompName = self.__Token\r
4294\r
4295 if not self.__IsKeyword("COMP_LOC"):\r
4296 raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber)\r
4297\r
4298 if not self.__IsToken("="):\r
4299 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4300\r
4301 CompStatementObj.CompLoc = ""\r
4302 if self.__GetNextWord():\r
4303 CompStatementObj.CompLoc = self.__Token\r
4304 if self.__IsToken('|'):\r
4305 if not self.__GetNextWord():\r
4306 raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber)\r
4307\r
4308 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
4309 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4310\r
4311 CompStatementObj.FilePos = self.__Token\r
4312 else:\r
4313 self.CurrentLineNumber += 1\r
4314 self.CurrentOffsetWithinLine = 0\r
4315\r
4316 if not self.__IsKeyword("COMP_TYPE"):\r
4317 raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber)\r
4318\r
4319 if not self.__IsToken("="):\r
4320 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4321\r
4322 if not self.__GetNextToken():\r
4323 raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
4324 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
4325 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
cfbe3c35 4326 not self.__Token[2] in string.hexdigits or not self.__Token[-1] in string.hexdigits:\r
30fdf114
LG
4327 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4328 CompStatementObj.CompType = self.__Token\r
4329\r
4330 if not self.__IsKeyword("COMP_VER"):\r
4331 raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber)\r
4332\r
4333 if not self.__IsToken("="):\r
4334 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4335\r
4336 if not self.__GetNextToken():\r
4337 raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
4338\r
9fd2164e 4339 Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL)\r
4231a819 4340 if Pattern.match(self.__Token) is None:\r
30fdf114
LG
4341 raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4342 CompStatementObj.CompVer = self.__Token\r
4343\r
4344 if not self.__IsKeyword("COMP_CS"):\r
4345 raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber)\r
4346\r
4347 if not self.__IsToken("="):\r
4348 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4349\r
4350 if not self.__GetNextToken():\r
4351 raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber)\r
4352 if self.__Token not in ("1", "0"):\r
4353 raise Warning("Unknown Component CS '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4354 CompStatementObj.CompCs = self.__Token\r
4355\r
4356\r
4357 if not self.__IsKeyword("COMP_BIN"):\r
4358 raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber)\r
4359\r
4360 if not self.__IsToken("="):\r
4361 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4362\r
4363 if not self.__GetNextToken():\r
4364 raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
4365\r
4366 CompStatementObj.CompBin = self.__Token\r
6310ffd7 4367 if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
4368 #check for file path\r
4369 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4370 if ErrorCode != 0:\r
4371 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4372\r
4373 if not self.__IsKeyword("COMP_SYM"):\r
4374 raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
4375\r
4376 if not self.__IsToken("="):\r
4377 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4378\r
4379 if not self.__GetNextToken():\r
4380 raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
4381\r
4382 CompStatementObj.CompSym = self.__Token\r
6310ffd7 4383 if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace('$(WORKSPACE)', '').find('$') == -1:\r
4384 #check for file path\r
4385 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4386 if ErrorCode != 0:\r
4387 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4388\r
4389 if not self.__IsKeyword("COMP_SIZE"):\r
4390 raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
4391\r
4392 if not self.__IsToken("="):\r
4393 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4394\r
4395 if self.__IsToken("-"):\r
4396 CompStatementObj.CompSize = self.__Token\r
4397 elif self.__GetNextDecimalNumber():\r
4398 CompStatementObj.CompSize = self.__Token\r
4399 elif self.__GetNextHexNumber():\r
4400 CompStatementObj.CompSize = self.__Token\r
4401 else:\r
4402 raise Warning("Unknown size '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4403\r
4404 VtfObj.ComponentStatementList.append(CompStatementObj)\r
4405 return True\r
4406\r
4407 ## __GetOptionRom() method\r
4408 #\r
4409 # Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
4410 #\r
4411 # @param self The object pointer\r
4412 # @retval True Successfully find a OptionROM\r
4413 # @retval False Not able to find a OptionROM\r
4414 #\r
4415 def __GetOptionRom(self):\r
4416\r
4417 if not self.__GetNextToken():\r
4418 return False\r
4419\r
4420 S = self.__Token.upper()\r
4421 if S.startswith("[") and not S.startswith("[OPTIONROM."):\r
df81077f
YZ
4422 self.SectionParser(S)\r
4423 self.__UndoToken()\r
4424 return False\r
f7496d71 4425\r
30fdf114
LG
4426 self.__UndoToken()\r
4427 if not self.__IsToken("[OptionRom.", True):\r
4428 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4429\r
4430 OptRomName = self.__GetUiName()\r
4431\r
4432 if not self.__IsToken( "]"):\r
4433 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
4434\r
4435 OptRomObj = OptionRom.OPTIONROM()\r
4436 OptRomObj.DriverName = OptRomName\r
4437 self.Profile.OptRomDict[OptRomName] = OptRomObj\r
4438\r
4439 while True:\r
4440 isInf = self.__GetOptRomInfStatement(OptRomObj)\r
4441 isFile = self.__GetOptRomFileStatement(OptRomObj)\r
4442 if not isInf and not isFile:\r
4443 break\r
f7496d71 4444\r
30fdf114
LG
4445 return True\r
4446\r
4447 ## __GetOptRomInfStatement() method\r
4448 #\r
4449 # Get INF statements\r
4450 #\r
4451 # @param self The object pointer\r
4452 # @param Obj for whom inf statement is got\r
4453 # @retval True Successfully find inf statement\r
4454 # @retval False Not able to find inf statement\r
4455 #\r
4456 def __GetOptRomInfStatement(self, Obj):\r
4457\r
4458 if not self.__IsKeyword( "INF"):\r
4459 return False\r
4460\r
4461 ffsInf = OptRomInfStatement.OptRomInfStatement()\r
4462 self.__GetInfOptions( ffsInf)\r
4463\r
4464 if not self.__GetNextToken():\r
4465 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
4466 ffsInf.InfFileName = self.__Token\r
6310ffd7 4467 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
4468 #check for file path\r
4469 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4470 if ErrorCode != 0:\r
4471 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4472\r
4473 if not ffsInf.InfFileName in self.Profile.InfList:\r
4474 self.Profile.InfList.append(ffsInf.InfFileName)\r
d0acc87a
LG
4475 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
4476 self.Profile.InfFileLineList.append(FileLineTuple)\r
2502b735
YZ
4477 if ffsInf.UseArch:\r
4478 if ffsInf.UseArch not in self.Profile.InfDict:\r
4479 self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName]\r
4480 else:\r
4481 self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName)\r
4482 else:\r
4483 self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
30fdf114 4484\r
f7496d71 4485\r
30fdf114 4486 self.__GetOptRomOverrides (ffsInf)\r
f7496d71 4487\r
30fdf114
LG
4488 Obj.FfsList.append(ffsInf)\r
4489 return True\r
4490\r
4491 ## __GetOptRomOverrides() method\r
4492 #\r
4493 # Get overrides for OptROM INF & FILE\r
4494 #\r
4495 # @param self The object pointer\r
4496 # @param FfsInfObj for whom overrides is got\r
4497 #\r
4498 def __GetOptRomOverrides(self, Obj):\r
4499 if self.__IsToken('{'):\r
8f3f5794 4500 Overrides = OptRomInfStatement.OverrideAttribs()\r
fd171542 4501 while True:\r
4502 if self.__IsKeyword( "PCI_VENDOR_ID"):\r
4503 if not self.__IsToken( "="):\r
4504 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4505 if not self.__GetNextHexNumber():\r
4506 raise Warning("expected Hex vendor id", self.FileName, self.CurrentLineNumber)\r
4507 Overrides.PciVendorId = self.__Token\r
4508 continue\r
4509\r
4510 if self.__IsKeyword( "PCI_CLASS_CODE"):\r
4511 if not self.__IsToken( "="):\r
4512 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4513 if not self.__GetNextHexNumber():\r
4514 raise Warning("expected Hex class code", self.FileName, self.CurrentLineNumber)\r
4515 Overrides.PciClassCode = self.__Token\r
4516 continue\r
4517\r
4518 if self.__IsKeyword( "PCI_DEVICE_ID"):\r
4519 if not self.__IsToken( "="):\r
4520 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4521 if not self.__GetNextHexNumber():\r
4522 raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber)\r
4523\r
4524 Overrides.PciDeviceId = self.__Token\r
4525 continue\r
4526\r
4527 if self.__IsKeyword( "PCI_REVISION"):\r
4528 if not self.__IsToken( "="):\r
4529 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4530 if not self.__GetNextHexNumber():\r
4531 raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber)\r
4532 Overrides.PciRevision = self.__Token\r
4533 continue\r
4534\r
79b74a03 4535 if self.__IsKeyword( "PCI_COMPRESS"):\r
fd171542 4536 if not self.__IsToken( "="):\r
4537 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4538 if not self.__GetNextToken():\r
4539 raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
4540 Overrides.NeedCompress = self.__Token.upper() == 'TRUE'\r
4541 continue\r
4542\r
4543 if self.__IsToken( "}"):\r
4544 break\r
4545 else:\r
4546 EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
4547\r
30fdf114 4548 Obj.OverrideAttribs = Overrides\r
f7496d71 4549\r
30fdf114
LG
4550 ## __GetOptRomFileStatement() method\r
4551 #\r
4552 # Get FILE statements\r
4553 #\r
4554 # @param self The object pointer\r
4555 # @param Obj for whom FILE statement is got\r
4556 # @retval True Successfully find FILE statement\r
4557 # @retval False Not able to find FILE statement\r
4558 #\r
4559 def __GetOptRomFileStatement(self, Obj):\r
4560\r
4561 if not self.__IsKeyword( "FILE"):\r
4562 return False\r
4563\r
4564 FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
4565\r
91fa33ee 4566 if not self.__IsKeyword("EFI") and not self.__IsKeyword(BINARY_FILE_TYPE_BIN):\r
30fdf114
LG
4567 raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
4568 FfsFileObj.FileType = self.__Token\r
4569\r
4570 if not self.__GetNextToken():\r
4571 raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
4572 FfsFileObj.FileName = self.__Token\r
6310ffd7 4573 if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
4574 #check for file path\r
4575 ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4576 if ErrorCode != 0:\r
4577 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4578\r
4579 if FfsFileObj.FileType == 'EFI':\r
4580 self.__GetOptRomOverrides(FfsFileObj)\r
f7496d71 4581\r
30fdf114
LG
4582 Obj.FfsList.append(FfsFileObj)\r
4583\r
4584 return True\r
fd171542 4585\r
4586 ## __GetCapInFd() method\r
4587 #\r
4588 # Get Cap list contained in FD\r
4589 #\r
4590 # @param self The object pointer\r
4591 # @param FdName FD name\r
4592 # @retval CapList List of Capsule in FD\r
4593 #\r
4594 def __GetCapInFd (self, FdName):\r
4595\r
4596 CapList = []\r
9eb87141 4597 if FdName.upper() in self.Profile.FdDict:\r
fd171542 4598 FdObj = self.Profile.FdDict[FdName.upper()]\r
4599 for elementRegion in FdObj.RegionList:\r
4600 if elementRegion.RegionType == 'CAPSULE':\r
4601 for elementRegionData in elementRegion.RegionDataList:\r
4602 if elementRegionData.endswith(".cap"):\r
4603 continue\r
4231a819 4604 if elementRegionData is not None and elementRegionData.upper() not in CapList:\r
fd171542 4605 CapList.append(elementRegionData.upper())\r
4606 return CapList\r
4607\r
4608 ## __GetReferencedFdCapTuple() method\r
4609 #\r
4610 # Get FV and FD list referenced by a capsule image\r
4611 #\r
4612 # @param self The object pointer\r
4613 # @param CapObj Capsule section to be searched\r
4614 # @param RefFdList referenced FD by section\r
4615 # @param RefFvList referenced FV by section\r
4616 #\r
4617 def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
4618\r
4619 for CapsuleDataObj in CapObj.CapsuleDataList :\r
4231a819 4620 if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName is not None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
fd171542 4621 RefFvList.append (CapsuleDataObj.FvName.upper())\r
4231a819 4622 elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName is not None and CapsuleDataObj.FdName.upper() not in RefFdList:\r
f7496d71 4623 RefFdList.append (CapsuleDataObj.FdName.upper())\r
4231a819 4624 elif CapsuleDataObj.Ffs is not None:\r
b36d134f 4625 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
4231a819 4626 if CapsuleDataObj.Ffs.FvName is not None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
b36d134f 4627 RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
4231a819 4628 elif CapsuleDataObj.Ffs.FdName is not None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
b36d134f
LG
4629 RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
4630 else:\r
4631 self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
fd171542 4632\r
30fdf114
LG
4633 ## __GetFvInFd() method\r
4634 #\r
4635 # Get FV list contained in FD\r
4636 #\r
4637 # @param self The object pointer\r
4638 # @param FdName FD name\r
4639 # @retval FvList list of FV in FD\r
4640 #\r
4641 def __GetFvInFd (self, FdName):\r
4642\r
4643 FvList = []\r
9eb87141 4644 if FdName.upper() in self.Profile.FdDict:\r
30fdf114
LG
4645 FdObj = self.Profile.FdDict[FdName.upper()]\r
4646 for elementRegion in FdObj.RegionList:\r
91fa33ee 4647 if elementRegion.RegionType == BINARY_FILE_TYPE_FV:\r
30fdf114 4648 for elementRegionData in elementRegion.RegionDataList:\r
fd171542 4649 if elementRegionData.endswith(".fv"):\r
4650 continue\r
4231a819 4651 if elementRegionData is not None and elementRegionData.upper() not in FvList:\r
30fdf114
LG
4652 FvList.append(elementRegionData.upper())\r
4653 return FvList\r
4654\r
4655 ## __GetReferencedFdFvTuple() method\r
4656 #\r
4657 # Get FD and FV list referenced by a FFS file\r
4658 #\r
4659 # @param self The object pointer\r
4660 # @param FfsFile contains sections to be searched\r
4661 # @param RefFdList referenced FD by section\r
4662 # @param RefFvList referenced FV by section\r
4663 #\r
4664 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
4665\r
4666 for FfsObj in FvObj.FfsList:\r
4667 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
4231a819 4668 if FfsObj.FvName is not None and FfsObj.FvName.upper() not in RefFvList:\r
30fdf114 4669 RefFvList.append(FfsObj.FvName.upper())\r
4231a819 4670 elif FfsObj.FdName is not None and FfsObj.FdName.upper() not in RefFdList:\r
30fdf114
LG
4671 RefFdList.append(FfsObj.FdName.upper())\r
4672 else:\r
4673 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
4674\r
4675 ## __GetReferencedFdFvTupleFromSection() method\r
4676 #\r
4677 # Get FD and FV list referenced by a FFS section\r
4678 #\r
4679 # @param self The object pointer\r
4680 # @param FfsFile contains sections to be searched\r
4681 # @param FdList referenced FD by section\r
4682 # @param FvList referenced FV by section\r
4683 #\r
4684 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
4685\r
4686 SectionStack = []\r
4687 SectionStack.extend(FfsFile.SectionList)\r
4688 while SectionStack != []:\r
4689 SectionObj = SectionStack.pop()\r
4690 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
4231a819 4691 if SectionObj.FvName is not None and SectionObj.FvName.upper() not in FvList:\r
30fdf114 4692 FvList.append(SectionObj.FvName.upper())\r
4231a819 4693 if SectionObj.Fv is not None and SectionObj.Fv.UiFvName is not None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
30fdf114
LG
4694 FvList.append(SectionObj.Fv.UiFvName.upper())\r
4695 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
4696\r
4697 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
4698 SectionStack.extend(SectionObj.SectionList)\r
4699\r
4700 ## CycleReferenceCheck() method\r
4701 #\r
4702 # Check whether cycle reference exists in FDF\r
4703 #\r
4704 # @param self The object pointer\r
4705 # @retval True cycle reference exists\r
4706 # @retval False Not exists cycle reference\r
4707 #\r
4708 def CycleReferenceCheck(self):\r
fd171542 4709 #\r
4710 # Check the cycle between FV and FD image\r
4711 #\r
4712 MaxLength = len (self.Profile.FvDict)\r
9eb87141 4713 for FvName in self.Profile.FvDict:\r
fd171542 4714 LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
4715 RefFvStack = []\r
4716 RefFvStack.append(FvName)\r
4717 FdAnalyzedList = []\r
f7496d71 4718\r
fd171542 4719 Index = 0\r
4720 while RefFvStack != [] and Index < MaxLength:\r
4721 Index = Index + 1\r
4722 FvNameFromStack = RefFvStack.pop()\r
9eb87141 4723 if FvNameFromStack.upper() in self.Profile.FvDict:\r
fd171542 4724 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
4725 else:\r
4726 continue\r
30fdf114 4727\r
fd171542 4728 RefFdList = []\r
4729 RefFvList = []\r
4730 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
30fdf114 4731\r
fd171542 4732 for RefFdName in RefFdList:\r
4733 if RefFdName in FdAnalyzedList:\r
30fdf114
LG
4734 continue\r
4735\r
fd171542 4736 LogStr += "FV %s contains FD %s\n" % (FvNameFromStack, RefFdName)\r
4737 FvInFdList = self.__GetFvInFd(RefFdName)\r
4738 if FvInFdList != []:\r
4739 for FvNameInFd in FvInFdList:\r
ccaa7754 4740 LogStr += "FD %s contains FV %s\n" % (RefFdName, FvNameInFd)\r
fd171542 4741 if FvNameInFd not in RefFvStack:\r
4742 RefFvStack.append(FvNameInFd)\r
4743\r
4744 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4745 EdkLogger.info(LogStr)\r
4746 return True\r
4747 FdAnalyzedList.append(RefFdName)\r
30fdf114 4748\r
fd171542 4749 for RefFvName in RefFvList:\r
4750 LogStr += "FV %s contains FV %s\n" % (FvNameFromStack, RefFvName)\r
4751 if RefFvName not in RefFvStack:\r
4752 RefFvStack.append(RefFvName)\r
4753\r
4754 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4755 EdkLogger.info(LogStr)\r
4756 return True\r
4757\r
4758 #\r
4759 # Check the cycle between Capsule and FD image\r
4760 #\r
4761 MaxLength = len (self.Profile.CapsuleDict)\r
9eb87141 4762 for CapName in self.Profile.CapsuleDict:\r
fd171542 4763 #\r
4764 # Capsule image to be checked.\r
4765 #\r
4766 LogStr = "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName\r
4767 RefCapStack = []\r
4768 RefCapStack.append(CapName)\r
4769 FdAnalyzedList = []\r
4770 FvAnalyzedList = []\r
f7496d71 4771\r
fd171542 4772 Index = 0\r
4773 while RefCapStack != [] and Index < MaxLength:\r
4774 Index = Index + 1\r
4775 CapNameFromStack = RefCapStack.pop()\r
9eb87141 4776 if CapNameFromStack.upper() in self.Profile.CapsuleDict:\r
fd171542 4777 CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
4778 else:\r
4779 continue\r
4780\r
4781 RefFvList = []\r
4782 RefFdList = []\r
4783 self.__GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList)\r
4784\r
4785 FvListLength = 0\r
4786 FdListLength = 0\r
4787 while FvListLength < len (RefFvList) or FdListLength < len (RefFdList):\r
30fdf114
LG
4788 for RefFdName in RefFdList:\r
4789 if RefFdName in FdAnalyzedList:\r
4790 continue\r
4791\r
fd171542 4792 LogStr += "Capsule %s contains FD %s\n" % (CapNameFromStack, RefFdName)\r
4793 CapInFdList = self.__GetCapInFd(RefFdName)\r
4794 if CapInFdList != []:\r
4795 for CapNameInFd in CapInFdList:\r
ccaa7754 4796 LogStr += "FD %s contains Capsule %s\n" % (RefFdName, CapNameInFd)\r
fd171542 4797 if CapNameInFd not in RefCapStack:\r
4798 RefCapStack.append(CapNameInFd)\r
4799\r
4800 if CapName in RefCapStack or CapNameFromStack in RefCapStack:\r
4801 EdkLogger.info(LogStr)\r
4802 return True\r
4803\r
30fdf114
LG
4804 FvInFdList = self.__GetFvInFd(RefFdName)\r
4805 if FvInFdList != []:\r
fd171542 4806 for FvNameInFd in FvInFdList:\r
ccaa7754 4807 LogStr += "FD %s contains FV %s\n" % (RefFdName, FvNameInFd)\r
fd171542 4808 if FvNameInFd not in RefFvList:\r
4809 RefFvList.append(FvNameInFd)\r
30fdf114 4810\r
fd171542 4811 FdAnalyzedList.append(RefFdName)\r
4812 #\r
4813 # the number of the parsed FV and FD image\r
4814 #\r
4815 FvListLength = len (RefFvList)\r
4816 FdListLength = len (RefFdList)\r
30fdf114 4817 for RefFvName in RefFvList:\r
fd171542 4818 if RefFvName in FvAnalyzedList:\r
4819 continue\r
4820 LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
9eb87141 4821 if RefFvName.upper() in self.Profile.FvDict:\r
fd171542 4822 FvObj = self.Profile.FvDict[RefFvName.upper()]\r
4823 else:\r
4824 continue\r
4825 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
4826 FvAnalyzedList.append(RefFvName)\r
30fdf114 4827\r
fd171542 4828 return False\r
30fdf114 4829\r
c17956e0
DL
4830 def GetAllIncludedFile (self):\r
4831 global AllIncludeFileList\r
4832 return AllIncludeFileList\r
4833\r
30fdf114 4834if __name__ == "__main__":\r
b36d134f
LG
4835 import sys\r
4836 try:\r
4837 test_file = sys.argv[1]\r
5b0671c1 4838 except IndexError as v:\r
72443dd2 4839 print("Usage: %s filename" % sys.argv[0])\r
b36d134f
LG
4840 sys.exit(1)\r
4841\r
4842 parser = FdfParser(test_file)\r
30fdf114
LG
4843 try:\r
4844 parser.ParseFile()\r
4845 parser.CycleReferenceCheck()\r
5b0671c1 4846 except Warning as X:\r
72443dd2 4847 print(str(X))\r
30fdf114 4848 else:\r
72443dd2 4849 print("Success!")\r
30fdf114 4850\r